我正在开发一个Spring-MVC应用程序。我想在数据库中保存图像并将它们显示在应用程序的JSP页面中。目前我能够在数据库中保存图像,但无法在前端显示它们。 图像不会显示,当我点击查看图像时,我收到一个Apache错误:
HTTP Status 404 - /product/%5BB@a2e6ab9
我通常认为,这将是二进制图像,显示的图像在点击视图时将显示完整的二进制数据,但事实并非如此。现在我将粘贴我用于显示的控制器,实体和JSP代码。
控制器:
@RequestMapping(value = "/product/{id}/image")
public byte[] retrieveimage(@ModelAttribute("product") ProductBasic productBasic,@PathVariable("id")Integer id){
User user = userService.getCurrentlyAuthenticatedUser();
ProductBasic productBasic1 = productBasicService.getProductById(id);
BASE64Encoder base64Encoder = new BASE64Encoder();
byte[] data = org.apache.commons.codec.binary.Base64.decodeBase64(productBasic1.getProductimage());
return data;
}
@RequestMapping(value="/product/show",method= RequestMethod.GET)
public String listProducts(@ModelAttribute("product") ProductBasic productBasic,Model model){
User user = userService.getCurrentlyAuthenticatedUser();
model.addAttribute("product", new ProductBasic());
model.addAttribute("listProducts",this.productBasicService.listProduct(user));
BASE64Encoder base64Encoder = new BASE64Encoder();
if(productBasic.getProductimage()==null){
System.out.println("getProductImage is null"); // This is always returning null when I check
return "product";
}else {
String image = "data:image/png;base64," + base64Encoder.encode(productBasic.getProductimage());
model.addAttribute("saveimage", image);
return "product";
}
}
JSP:
<h3>Product List</h3>
<c:if test="${!empty listProducts}">
<table class="tg">
<tr>
<th width="80">Product ID</th>
<th width="80">Product image</th>
<th width="120">Product name</th>
<th width="120">Product description</th>
<th width="120">Product condition</th>
<th width="120">Product age</th>
<th width="120">Product EAN</th>
<th width="120">Product ISBN</th>
<th width="120">Product ordernumber</th>
<th width="120">Product owners id</th>
<th width="60">Edit</th>
<th width="60">Delete</th>
</tr>
<c:forEach items="${listProducts}" var="product">
<tr>
<td>${product.productid}</td>
<td>${product.productimage} </td>
<td>${product.productname}</td>
<td>${product.productdescription}</td>
<td>${product.productcondition}</td>
<td>${product.productage}</td>
<td>${product.productean}</td>
<td>${product.productisbn}</td>
<td>${product.ordernumber}</td>
<td>${product.user1id}</td>
<img src="${product.productimage}" height="100" width="100"/>
<td><a href="<c:url value='/editproduct/${product.productid}' />" >Edit Product</a></td>
<td><a href="<c:url value='/removeproduct/${product.productid}' />" >Delete Product</a></td>
</tr>
<%--<img src="${saveimage}" height="100" width="100">--%>
</c:forEach>
</table>
</c:if>
实体:
@Entity
@Table(name = "product")
public class ProductBasic {
@Column(name = "productimage")
byte[] productimage;
}
public byte[] getProductimage() {
return productimage;
}
public void setProductimage(byte[] productimage) {
this.productimage = productimage;
}
DAOImpl:
@Override
public List<byte[]> listImage(User user){
int id = user.getId();
if(session == null){
session = this.sessionFactory.openSession();
} else{
session = this.sessionFactory.getCurrentSession();
}
Query query = session.createQuery("from ProductBasic as p where p.user1.id=:id order by p.ordernumber");
query.setParameter("id",id);
List<ProductBasic> productBasicList= query.list();
List<byte[]> images=null;
if(productBasicList.isEmpty()){
return null;
} else {
for (ProductBasic productBasic : productBasicList) {
images.add(productBasic.getProductimage()); // Here there is nullPointer Exception
}
return images;
}
}
}
@Shazin:
将图像保存在服务中,如下所示:
@Override
@Transactional
public void addProduct(User user, ProductBasic p){
p.setProductimage(org.apache.commons.codec.binary.Base64.decodeBase64(p.getProductimage()));
this.productBasicDAO.addProduct(user, p);
}
用于productImage的实体中的Getter是:
public byte[] getProductimage() {
return productimage;
}
public void setProductimage(byte[] productimage) {
this.productimage = productimage;
}
当我点击firefox中的视图图像时,出现以下错误:
java.lang.IllegalArgumentException: Unknown return value type [[B]
org.springframework.util.Assert.notNull(Assert.java:112)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:70)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
答案 0 :(得分:0)
HTML img
标记不适用于二进制字节数据。它有一个src
属性,它接受一个URL,它使用一个单独的GET请求来检索图像二进制字节数据。
您可以做的是使用Controller方法返回二进制字节数据,如
/product/{id}/image
,当提供{id}时必须返回二进制字节数据。
使用此功能,您可以更改代码,如下所示
产品编号 产品图片 产品名称 产品描述 产品状况 产品年龄 产品EAN 产品ISBN 产品订单号 产品所有者ID
<th width="60">Edit</th>
<th width="60">Delete</th>
</tr>
<c:forEach items="${listProducts}" var="product">
<tr>
<td>${product.productid}</td>
<td>${product.productimage} </td>
<td>${product.productname}</td>
<td>${product.productdescription}</td>
<td>${product.productcondition}</td>
<td>${product.productage}</td>
<td>${product.productean}</td>
<td>${product.productisbn}</td>
<td>${product.ordernumber}</td>
<td>${product.user1id}</td>
<!-- This Changed -->
<img src="/product/${product.productid}/image" height="100" width="100"/>
<td><a href="<c:url value='/editproduct/${product.productid}' />" >Edit Product</a></td>
<td><a href="<c:url value='/removeproduct/${product.productid}' />" >Delete Product</a></td>
</tr>
<%--<img src="${saveimage}" height="100" width="100">--%>
</c:forEach>
</table>
答案 1 :(得分:0)
我认为我们应该从$ {product.productimage}而不是二进制数据中获取图像的网址。 所以Product的属性“productimage”可以是字符串类型。我们可以在DB中存储一个URL,例如“/xxx/xxx.Jpg”