有人可以请求帮助,我正在尝试使用Spring MVC + Hibernate从数据库中检索带有一些文本的图像但是却非常失败。我能够显示一个或另一个,但不能同时显示(图像和文本),它也会在控制台中显示错误。
错误: - getOutputStream() has already been called for this response
DAO: -
public List<Product> listProductsById(Integer productId) {
List<Product> prod = em.createNamedQuery("Product.findByProductId")
.setParameter("productId", productId).getResultList();
return prod;
}
public byte[] loadImage(Integer productId){
return em.find(Product.class, productId).getimage();
}
控制器: -
@RequestMapping(value = "details/{id}", method = RequestMethod.GET)
public String showProductDetails(@PathVariable("id") Integer id,
Model model, HttpServletResponse response) throws IOException {
List<Product> product = olss.listProductById(id);
byte[] image = olss.loadImage(id);
response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
response.getOutputStream().write(image);
response.getOutputStream().flush();
response.getOutputStream().close();
model.addAttribute("prodList", product);
model.addAttribute("prodList", image);
return "prodDetails";
}
JSP: -
<img alt="Image of product" src="prodDetails?id=${prod.productId}">
答案 0 :(得分:0)
欢迎使用堆栈溢出(可能还有MVC编程)。您不会以您尝试的方式将模型返回到视图。图像可以像png,gif,jpg这样的有效图像格式作为自己的响应提供。不是字节数组
您的图片代码如下所示:
然后你需要设置一个单独的控制器函数来返回图像:
@RequestMapping...
public @ResponseBody byte[] productLabel(...) {
byte[] imageByte = new byte[0];
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
imageByte = baos.toByteArray();
baos.close();
} catch(IOException e) {
logger.error("Unable to generate Image for Shipping Label on Order "+orderId+". "+
e.getLocalizedMessage());
return null;
}
return imageByte;
}
注意你的想法是错误的:JSP是一个用于生成HTML的模板引擎。您不会在html页面中嵌入图像,而是定义带有图像路径的图像标记。
答案 1 :(得分:0)
model.addAttribute("prodList", product);
model.addAttribute("prodList", image);
也许这是你的问题..你将差异值放在同一个键中。
或者为什么不将图像的文件名保存在数据库中。See This Link