将图像写入数据库中的jsp

我正在尝试将数据写入数据库中的jsp(保存为BLOB)。 我正在使用spring并且在我的控制器中,我确实有图像byte []。

所以我这样做

byte[] imageBytes = dao.getImage(cc);

model.setAttribute("myimage", new String(imageBytes));

在我的jsp中,我有

<img src=https://stackoverflow.com/questions/14899591/writing-image-to-a-jsp-from-database/data:image/jpg;base64,"" alt="my image" />

但我只在我的jsp页面中看到ascii charcaters(如下所示)。

K_&W:???= 5)^ – Øř滋* \ * M 1 ??] ?,Z?我?P 450ž〜v&CenterDot; K + LMS?如参见]一个?他/ ?; k]的W’C吗?如参见] ?? ?????曲〜 – LZ Z:6 ?? Z = A + E’5 ??? ?C. |?WVý – ?? U·Λd克ݭ)A 10 7 $ ????] ??] S 3 BO?Lezhgzn? ? ?E . ?. ] T m z h t U| E}?K > T | Q ] Vd ? Q? G E A ? ˰* wz i(sh? U^ b? z ~?v m Z i q ULF%LZ〜vozi;?!?&FVϨķü޵ü?? VXXѯ? > W [çֻ的Kt ?????)在线2 b} M·G·hѯA/?济( 3?

我甚至尝试将byte []转换为ByteArrayOutputStream并使用Base64对其进行编码,但是没有工作

model.addAttribute("image", Base64.encode(imageBytes));

但是当我使用FileOutputStream将byte []写入文件(myimage.jpg)时,我确实看到了使用老式方式在我的jsp中显示的图像

不幸的是它不起作用。

您需要使用Spring MVC Controller方法,它将您的图像作为byte []写入您的HttpServletResponse类。

例:

 @RequestMapping("/getImage/{id}") public void getImage(HttpServletResponse response,@PathVariable("id") final String id) throws IOException { response.setContentType("image/jpeg"); byte[] imageBytes = dao.getImage(id); response.getOutputStream().write(imageBytes); response.getOutputStream().flush(); } 

然后在客户端上使用html代码:

  

更新:是的,你可以从Spring 3.1开始使用@ResposneBody注释

注册您的ByteArrayHttpMessageConverter

      image/jpeg image/png      

然后使用你的控制器:

 @RequestMapping("/getPhoto/{id}") public @ResponseBody byte[] getPhoto(@PathVariable("id") final String id) throws IOException { byte[] imageBytes = dao.getImage(id); return imageBytes; } 

诀窍是让另一个servlet直接将数据输出到HttpServletResponse.getOutputStream() ,并且正如SuKu所说的那样具有适当的内容类型。 然后在JSP中,您只需指向图像servlet在标记中映射到的URL。 例如,如果图像servlet映射到/imgServlet ,你可以使用这样的东西

  

试试这样的东西http://www.avajava.com/tutorials/lessons/how-do-i-return-an-image-from-a-servlet-using-imageio.html

如果您喜欢使用ModelAndView,另一个选项是创建一个自定义View对象,该对象设置媒体类型并将图像的字节输出到输出流。 这样,如果出现错误,您可以使用ModelAndView轻松设置重定向或返回正常错误甚至是JSP错误页面,例如找不到图像。

 @RequestMapping(value="/imageDisplays/{imageId}") public void getImage(@PathVariable int imageId,HttpSession session,HttpServletResponse response) { OutputStream oImage; try{ byte[] imageInByte = // get image in byte array response.setContentType("image/jpeg, image/jpg, image/png, image/gif"); oImage=response.getOutputStream(); oImage.write(imageInByte); oImage.flush(); oImage.close(); }catch(Exception e){ LOGGER.debug("Request could not be completed at this moment. Please try again."); e.printStackTrace(); } } 

这与我正在研究的问题类似。 但是,我使用长轮询而不是servlet。 这是链接stackoverflow。