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

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

File file = new File(my_file_path); AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred)); s3.putObject(new PutObjectRequest("folder", key, file)); 

以上工作正常,但我想直接将一个BufferedImage保存到S3,从我的应用程序中刮几秒钟,但我不知道如何做到这一点? 这就是我目前将图像保存到文件的方式:

 image = new BufferedImage(rawImage.width, rawImage.height, BufferedImage.TYPE_INT_ARGB); File file = new File(filepath); ImageIO.write(image, "png", file); 

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

另外,这是个好主意吗? 如果它容易出错,我会坚持我现在的方法。 任何建议表示赞赏

以下(或类似的东西)应该可以正常工作。 避免写入物理文件的步骤应该比处理磁盘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)); 

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

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