5 回答
不幸的是,它不起作用。
您需要使用 Spring MVC 控制器方法,它将您的图像作为 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代码:
<img src="getImage/222" ... />
更新:是的,您可以@ResposneBody
从 Spring 3.1 开始使用注释
注册您的ByteArrayHttpMessageConverter
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>image/jpeg</value>
<value>image/png</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
然后使用你的控制器:
@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 所说,使用适当的内容类型。<img/>
然后在您的 JSP 中,您只需指向您的图像 servlet 在标记中映射到的 URL 。例如,如果图像 servlet 映射到/imgServlet
,您将使用类似这样的东西
<img src="imgServlet?img=myimage" ... />
试试这样的http://www.avajava.com/tutorials/lessons/how-do-i-return-an-image-from-a-servlet-using-imageio.html
这是一个与我正在研究的问题类似的问题。但是,我使用的是长轮询而不是 servlet。这是链接stackoverflow。
如果您喜欢使用 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();
}
}