图片未出现在 jsp 页面中
Image is not coming in jsp page
当我插入图像时,我使用 Base64 编码:
//编码图像
byte[] byteArray = Base64.encodeBase64(productImage.getBytes());
为了在我的 spring 控制器中获取产品详细信息,我正在获取如下数据:
@GetMapping(value = "/searchNewAddedProducts")
public ModelAndView getAllNewAddedProducts(HttpServletRequest request) {
String msg=null;
List<ProductWithBLOBs> newList=new ArrayList<>();
List<ProductWithBLOBs> newProductList = productService.fetchNewAddedProduct();
if(!newProductList.isEmpty()) {
for(ProductWithBLOBs prod:newProductList) {
prod.setProductImage(Base64.decodeBase64(prod.getProductImage()));
newList.add(prod);
System.out.println("image:"+prod.getProductImage());
}
request.setAttribute("newProductList", newList);
}
msg="some message";
ModelAndView mav = new ModelAndView("admin/viewProduct");
mav.addObject("result", msg);
return mav;
}
在我的 jsp 中,我使用 Jstl 来迭代列表数据并显示在 table:
<c:forEach items="${newProductList}" var="product">
<tr>
<td><c:out value="${product.sku}"/></td>
<td><c:out value="${product.productName}"/></td>
<td><c:out value="${product.price}"/></td>
<td><img src="${product.productImage}"/></td>
<td><c:out value="${product.productDescription}"/></td>
</tr>
</c:forEach>
我在 jsp 中尝试了另一种方法来调用控制器,例如
<td> <img id=productImage" name="productImage" src="getProducctImage/'${product.sku}'/>"></td>
它甚至没有调用我的控制器:
@GetMapping("/getProducctImage/{sku}")
public void getProductImage(HttpServletResponse response,@RequestParam("sku") String sku)
throws IOException{
response.setContentType("image/*");
byte[] img = productService.fetchProductImageBySku(sku);
if(img!=null) {
img=Base64.decodeBase64(img);
InputStream inputStream = new ByteArrayInputStream(img);
IOUtils.copy(inputStream, response.getOutputStream());
}
}
这里的productImage是byte[]类型的,我需要帮助,我错过了哪一步或者我做错了什么
在您的第一种方法中,您可以使用“数据 URI 方案”来显示图像。
如果您的图像数据格式是 jpeg
,您的 img
标签将类似于:
<img src="data:image/jpg;base64,${product.productImageBase64String}"/>
当你像上面那样使用'data URI scheme'时,你需要将图像数据嵌入到text(html)中。因此,您必须像这样将 base64 编码字符串格式的图像数据设置为 productImageBase64String
字段。
// 'prod.productImage' is a base64-encoded byte array.
prod.setProductImageBase64String(new String(prod.getProductImage(), "UTF-8"));
在您的另一种方法中,我认为通过更改 <img>
标签可以正常工作:
<img id="productImage" name="productImage" src="/getProducctImage/${product.sku}"/>
另请参阅
Why use data URI scheme?
@Tomoki 感谢您的宝贵建议,非常感谢您的帮助。
我正在使用一种使用 servlet 的不同方法,并在我的 jsp 中进行了如下更改:
<td> <img width="100" height="100" src="${request.contextPath}displayProductImage?sku=${product.sku}"/></td>
在 Servlet get 方法中:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String sku = request.getParameter("sku");
String imageAsString = productService.fetchProductImageBySku(sku);
if (imageAsString == null) {
return;
} else {
byte[] decodedImage = Base64.decodeBase64(imageAsString);
response.reset();
response.setContentType("image/.*");
OutputStream out = response.getOutputStream();
out.write(decodedImage);
out.close();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
当我插入图像时,我使用 Base64 编码:
//编码图像
byte[] byteArray = Base64.encodeBase64(productImage.getBytes());
为了在我的 spring 控制器中获取产品详细信息,我正在获取如下数据:
@GetMapping(value = "/searchNewAddedProducts")
public ModelAndView getAllNewAddedProducts(HttpServletRequest request) {
String msg=null;
List<ProductWithBLOBs> newList=new ArrayList<>();
List<ProductWithBLOBs> newProductList = productService.fetchNewAddedProduct();
if(!newProductList.isEmpty()) {
for(ProductWithBLOBs prod:newProductList) {
prod.setProductImage(Base64.decodeBase64(prod.getProductImage()));
newList.add(prod);
System.out.println("image:"+prod.getProductImage());
}
request.setAttribute("newProductList", newList);
}
msg="some message";
ModelAndView mav = new ModelAndView("admin/viewProduct");
mav.addObject("result", msg);
return mav;
}
在我的 jsp 中,我使用 Jstl 来迭代列表数据并显示在 table:
<c:forEach items="${newProductList}" var="product">
<tr>
<td><c:out value="${product.sku}"/></td>
<td><c:out value="${product.productName}"/></td>
<td><c:out value="${product.price}"/></td>
<td><img src="${product.productImage}"/></td>
<td><c:out value="${product.productDescription}"/></td>
</tr>
</c:forEach>
我在 jsp 中尝试了另一种方法来调用控制器,例如
<td> <img id=productImage" name="productImage" src="getProducctImage/'${product.sku}'/>"></td>
它甚至没有调用我的控制器:
@GetMapping("/getProducctImage/{sku}")
public void getProductImage(HttpServletResponse response,@RequestParam("sku") String sku)
throws IOException{
response.setContentType("image/*");
byte[] img = productService.fetchProductImageBySku(sku);
if(img!=null) {
img=Base64.decodeBase64(img);
InputStream inputStream = new ByteArrayInputStream(img);
IOUtils.copy(inputStream, response.getOutputStream());
}
}
这里的productImage是byte[]类型的,我需要帮助,我错过了哪一步或者我做错了什么
在您的第一种方法中,您可以使用“数据 URI 方案”来显示图像。
如果您的图像数据格式是 jpeg
,您的 img
标签将类似于:
<img src="data:image/jpg;base64,${product.productImageBase64String}"/>
当你像上面那样使用'data URI scheme'时,你需要将图像数据嵌入到text(html)中。因此,您必须像这样将 base64 编码字符串格式的图像数据设置为 productImageBase64String
字段。
// 'prod.productImage' is a base64-encoded byte array.
prod.setProductImageBase64String(new String(prod.getProductImage(), "UTF-8"));
在您的另一种方法中,我认为通过更改 <img>
标签可以正常工作:
<img id="productImage" name="productImage" src="/getProducctImage/${product.sku}"/>
另请参阅
Why use data URI scheme?
@Tomoki 感谢您的宝贵建议,非常感谢您的帮助。 我正在使用一种使用 servlet 的不同方法,并在我的 jsp 中进行了如下更改:
<td> <img width="100" height="100" src="${request.contextPath}displayProductImage?sku=${product.sku}"/></td>
在 Servlet get 方法中:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String sku = request.getParameter("sku");
String imageAsString = productService.fetchProductImageBySku(sku);
if (imageAsString == null) {
return;
} else {
byte[] decodedImage = Base64.decodeBase64(imageAsString);
response.reset();
response.setContentType("image/.*");
OutputStream out = response.getOutputStream();
out.write(decodedImage);
out.close();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}