繁体   English   中英

使用servlet在Web浏览器上显示存储在amazon s3中的图像

[英]Displaying an image stored in amazon s3 on the web browser using servlet

我已将图像存储在S3中。

我有的 -

包含图像的输入流。

我想要的是?

设计一个可以将此输入流转换为图像的servlet。

请帮忙。 我是这一切的新手。

最简单的方法是直接使用S3网址。

对于公共文件,它们的格式为:

http://s3.amazonaws.com/[bucket]/[key]

但是,正如@TJ在他的回答中指出的那样,这些图像将在外部可见。

但是,您可以将您的内容设为私有,以便标准网址无法访问该内容,并且只能通过已签名的过期网址访问 java AWS SDK可以轻松创建这些。

您的servlet将收到一个response参数,该参数是一个ServletResponse实例,它具有getOutputStream方法。 使用setContentType根据图像数据设置响应的内容类型,使用getOutputStream获取输出流,然后循环,从输入流中读取并写入输出流。

或者,如果它适合您正在做的事情(可能会或可能不会),您可以将HTML点中的img标记直接指向s3中的图像,并避免将其完全通过您的服务器流式传输。 但是,当然,只有在外部可以访问图像时才能正常工作。 如果您搜索“s3发布图像”,您会发现各种文章(包括SO自己的Jeff Atwood的文章)关于这样做,我不会随机选择一个链接到这里。

在HTML中

<img src='setImageFromS?path=sample/file&fileName=image.jpg'>

在Servlet中

public void setImageFromS3(HttpServletRequest request, HttpServletResponse response) {
    File tmp = null;
    try {
        // create a client connection based on credentials
        AmazonS3 s3client = new AmazonS3Client(getAWSCredentials());

        String bucketName = getS3BucketName();
        String fileName = "";
        // upload file to folder and set it to public
        fileName = request.getParameter("path") +"/" + request.getParameter("fileName");
        S3Object o = s3client.getObject(bucketName, fileName);
        S3ObjectInputStream s3is = o.getObjectContent();
        tmp = File.createTempFile("s3test", ".jpeg");
        Files.copy(s3is, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();

        try {
          BufferedImage image = ImageIO.read(tmp);
          ImageIO.write(image, "jpeg", jpegOutputStream);
        } catch (IllegalArgumentException e) {
          response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
        tmp.delete();
        byte[] imgByte = jpegOutputStream.toByteArray();

        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream = response.getOutputStream();
        responseOutputStream.write(imgByte);
        responseOutputStream.flush();
        responseOutputStream.close();

    } catch (IOException ex) {
        Logger.getLogger(AmazonS3DaoImpl.class.getName()).log(Level.SEVERE, null, ex);
    }
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM