如何使用Struts 2从服务器检索图像

时间:2015-06-06 13:57:41

标签: java image jsp struts2 io

我有一个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}">

但是这个解决方案不起作用,据我了解,它对图像大小有限制。

你能建议我怎么做这样的事吗?

3 个答案:

答案 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=""/>