将 BufferedImage 对象作为文件保存到 Amazon S3

2022-09-02 09:06:05

我目前利用以下内容将文件上传到S3:

File file = new File(my_file_path);

AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred));

s3.putObject(new PutObjectRequest("folder", key, file));

以上工作正常,但我想直接从S3保存一个,从我的应用程序中剃掉几秒钟,但我不知道该怎么做?这是我当前将图像保存到文件的方式:BufferedImage

image = new BufferedImage(rawImage.width, rawImage.height, BufferedImage.TYPE_INT_ARGB);

File file = new File(filepath); 

ImageIO.write(image, "png", file);

有没有办法直接将写入 Amazon S3 作为流,如果是这样,有人可以展示一个例子吗?

此外,这是一个好主意吗?如果它容易出错,我会坚持我目前的方法。任何建议都值得赞赏。


答案 1

以下内容(或类似的东西)应该可以正常工作。避免写入物理文件的步骤应该比处理磁盘 I/O 稍微不容易出错(至少,随着时间的推移,填满磁盘的机会会降低)。

BufferedImage image = ...
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
byte[] buffer = os.toByteArray();
InputStream is = new ByteArrayInputStream(buffer);
AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred));
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(buffer.length);
s3.putObject(new PutObjectRequest("folder", key, is, meta));

答案 2

我强烈建议在 AWS 开发工具包中使用 TransferManager API。您可以在 AWS 博客文章中阅读有关它的更多信息。以下是有关其优势的片段:

在这个简单的API背后,TransferManager为你做了很多工作。根据上传的大小和数据源,TransferManager 会调整用于处理传输的算法,以获得最佳性能和可靠性。只要有可能,上传就会分成多个部分,以便可以并行发送多个部分以提供更好的吞吐量。除了更高的吞吐量之外,此方法还支持更可靠的传输,因为任何单个片段中的 I/O 错误意味着 SDK 只需要重新传输受影响的片段,而不需要整个传输。


推荐