将图像写入数据库中的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。