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

时间:2011-01-14 10:37:53

标签: java java-ee amazon-s3

我已将图像存储在S3中。

我拥有什么 -

包含图像的输入流。

我想要什么?

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

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

3 个答案:

答案 0 :(得分:4)

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

对于公共文件,它们采用以下格式:

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

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

但是,您可以制作内容private,以便标准网址无法访问该内容,只能通过signed, expiring url访问。 java AWS SDK可以轻松创建这些内容。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

以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;
}