我已将图像存储在S3中。
我拥有什么 -
包含图像的输入流。
我想要什么?
设计一个可以将此输入流转换为图像的servlet。
请帮忙。我是这一切的新手。
答案 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;
}