1

I stored an image in mysql database table in a byte format. when i am retrieving that image from database i am getting like this. enter image description here

So dispatcher-servlet.xml is as follows

<beans:bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

         <!-- setting maximum upload size -->
        <beans:property name="maxUploadSize" value="100000" />

    </beans:bean>

pom.xml

<!-- Apache Commons FileUpload --> 
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

<!-- Apache Commons IO --> 
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

driversList.jsp

<div style="color: teal; font-size: 20px">List Of Drivers</div>
            <c:if test="${!empty listDrivers}">
                <table border="1" bgcolor="black" width="600px">
                    <tr
                        style="background-color: teal; color: white; text-align: center;"
                        height="40px">
                        <th width="60">Name</th>
                        <th width="80">License Number</th>
                        <!--  <th width="80">Password</th> -->
                        <th width="80">Phone</th>

                        <th width="80">Password</th>
                        <th width="80">Address</th>
                        <th width="80">Photo</th>

                    </tr>
                    <c:forEach items="${listDrivers}" var="driver">
                        <tr
                            style="background-color: white; color: black; text-align: center;"
                            height="30px">

                            <td>${driver.name}</td>
                            <td>${driver.license}</td>
                            <td>${driver.number}</td>

                            <td>${driver.password}</td>
                            <td>${driver.address}</td>
                            <td><img src="/momcab1/myImage/imageDisplay?id=${driver.id}"/></td>

                        </tr>
                    </c:forEach>
                </table>
            </c:if>
            <!-- Content data end -->
            <br> <br> <br> <br> <br> <br> <br>
            <br> <br> <br>
        </div>

DriverController.java

@RequestMapping(value = "/DriversList", method = RequestMethod.GET)
    public String listUsers(Model model,HttpServletRequest req,HttpServletResponse res) {

        HttpSession session =req.getSession();
         if(session.getAttribute("emailId")==null)
         {
             return "redirect:/login";
         }
         System.out.println("MY NAME IS GO PINK");
        model.addAttribute("listDrivers", this.driverService.listDrivers());
        return "driversList";
    }

ImageController.java

@Controller
@RequestMapping("/myImage")
public class ImageController {

    @Value("${login_session_token_timeout_mnts}")
    private String loginSessionTokenTimeoutMnts;

    private DriverService driverService;

    @Autowired(required = true)
    @Qualifier(value = "driverService")
    public void setDriverService(DriverService ds) {
        this.driverService = ds;
    }

    @RequestMapping(value = "/imageDisplay", method = RequestMethod.GET)
      public void showImage(@RequestParam("id") Integer id, HttpServletResponse response,HttpServletRequest request) 
              throws ServletException, IOException{


        Driver item = driverService.getDriverById(id);       
        response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
        response.getOutputStream().write(item.getBlobImg());


        response.getOutputStream().close();
    }

}

Driver.java

@Column(name = "photo")
    private byte[] blobImg;

So here when a person clicks on "Drivers List" then the Request Mapping goes to "/DriversList" of DriverController.java But in my driversList.jsp there is an image to be displayed from mysql database table. but when the page is loaded it is not even going into the controller request mapping given in "<img src>" and it is displaying a "cross mark" as shown below.Any help in this will be appreciated.

Thanking You

And i tried the code given in this enter link description here

Community
  • 1
  • 1
FIFA oneterahertz
  • 718
  • 2
  • 16
  • 43

2 Answers2

0

This has been answered before Spring MVC: How to return image in @ResponseBody?. You might be missing encoding or something like that is the most likely candidate. But what's it matter, just use the approach everyone else is using that everyone knows works.

As an example

public class HELLOWORLD {


  class FooEntity {

    // TODO - ids and other stuff

    @Lob @Basic(fetch = FetchType.LAZY)
    private byte[] imageBytes;

    public byte[] getImageBytes() {
      return imageBytes;
    }
  }

  interface FooService {
    public FooEntity get(int id);
  }


  public static byte[] bufferedImageToByteArray(BufferedImage img) throws IOException
  {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ImageIO.write(img, "png", baos ); // I think this doesn't matter, I have jpg here
      return baos.toByteArray();
  }

  FooService fooService;

  @RequestMapping(value = "/foo/image/{id}")
  @ResponseBody
  public byte[] GetUserImageTiny(Model model, @PathVariable Integer id) throws IOException
  {   
      FooEntity fooEntity = fooService.get(id);
      byte[] imageInByte = fooEntity.getImageBytes();
      // you may be able to just go:
      // return imageInByte;
      // but I actually create the image:
      InputStream in = new ByteArrayInputStream(imageInByte);
      BufferedImage bImageFromConvert = ImageIO.read(in); // you could then debug here, write the image to a file to test if it's all good.
      // I sometimes resize the image too which I would do here
      // otherwise just return the image
      return bufferedImageToByteArray(bImageFromConvert);
  }

}
Community
  • 1
  • 1
Derrops
  • 7,651
  • 5
  • 30
  • 60
0

I GOT THE ANSWER...........

Its my addition of an image to database is wrong.So i modified the code of adding an image to database

@RequestMapping(value = "/Drivers/add", method = RequestMethod.POST)
    public String addUser(@ModelAttribute("driver") Driver driver,BindingResult result,@RequestParam("blobImg") MultipartFile blobImg) {

        if (driver.getId() == 0) {
            // new user, add to DB

            System.out.println("Name:" + driver.getName());

            System.out.println("File:" + blobImg.getSize());
            System.out.println("ContentType:" + blobImg.getContentType());

                    try {
                        driver.setBlobImg(blobImg.getBytes());
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                 }


                this.driverService.addDriver(driver);





        return "redirect:/Drivers";

    }

And then i fetched through this code

@RequestMapping(value = "/imageDisplay/{id}", method = RequestMethod.GET)
      public String showImage(@PathVariable("id") int id, HttpServletResponse response,HttpServletRequest request) 
              throws ServletException, IOException{
System.out.println("Image isn't coming");
System.out.println("Id is"+id);
        Driver item = driverService.getDriverById(id);    
                 try {
        response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
        response.getOutputStream().write(item.getBlobImg());


        response.getOutputStream().close();
                 }
                 catch(Exception e) {
                     e.printStackTrace();
                 }
       return "driversList";
    }
FIFA oneterahertz
  • 718
  • 2
  • 16
  • 43