我有一个Product
实体,它有一个imageUrl
字符串字段。
从用户获取后的产品图像将保存在目录中:
System.getProperty("user.home") + "shop/data/product/"
当用户希望看到一些Product
时,我需要将此图像从"user.home"+...
获取到JSP页面。
我试图将图像读入字节数组,将其转换为Base64编码,然后在JSP中引用如下:
<img alt="image from user home" src="data:image/png, base64;${requestScope.image}">
但是这个解决方案不起作用,据我了解,它对图像大小有限制。
你能建议我怎么做这样的事吗?
答案 0 :(得分:2)
试试这个(我觉得你有一些错字)
<img alt="image from user home" src="data:image/png;base64,${requestScope.image}">
还要使用此网站:http://www.askapache.com/online-tools/base64-image-converter/以确保输出Base64代码正确无误。
答案 1 :(得分:1)
所以 Alireza Fattahi 是对的,我的代码中有错误。第一个是img
标签中的拼写错误(见Alireza Fattahi的答案),第二个是读取图像到字节数组
byte[] image = ...;
我用过
Base64.getEncoder().encode(image);
而不是
Base64.getEncoder().encodeToString(image));
因此最终这个返回Base64编码图像的方法有效。如果有更好的选择 - 请留下评论和答案。
答案 2 :(得分:1)
有ImageAction
的示例,它为文件系统中的图像提供服务。它被称为
Struts 2 dynamic image example。
而不是base64编码/解码,它会增加内容长度两次并减慢页面加载速度,您可以使用从文件中返回图像字节的操作。它可以是一个数据库,这样它应该从Blob
获取字节。
在使用<img>
属性的src
标记中,可以包含返回带标头Content-Type: image/jpeg
的响应的操作的URL以及写入正文的字节。
这是ImageAction
:
@Result(type = "stream", params = {"contentType", "${type}"})
public class ImageAction extends ActionSupport implements ServletRequestAware {
byte[] imageInByte = null;
String imageId;
private HttpServletRequest servletRequest;
private final static String type = "image/jpeg";
public getInputStream() { return new ByteArrayInputStream(getCustomImageInBytes()); }
public String getType() { return type; }
private String getFilename() {
return this.filename;
}
public String getImageId() {
return imageId;
}
public void setImageId(String imageId) {
this.imageId = imageId;
}
public ImageAction() {
System.out.println("ImageAction");
}
public byte[] getCustomImageInBytes() {
System.out.println("imageId" + imageId);
BufferedImage originalImage;
try {
originalImage = ImageIO.read(getImageFile(this.imageId));
// convert BufferedImage to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(originalImage, "jpeg", baos);
baos.flush();
imageInByte = baos.toByteArray();
baos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return imageInByte;
}
private File getImageFile(String imageId) {
String filePath = servletRequest.getSession().getServletContext().getRealPath("/");
File file = new File(filePath + "/Image/", imageId);
System.out.println(file.toString());
return file;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.servletRequest = request;
}
}
此操作应该由convention-plugin
创建配置。所以它可以在HTML中使用
<img src="<s:url action='Image?imageId=darksouls.jpg' />" alt=""/>