是否可以使用s3 java sdk通过流写入s3

Adi*_*vek 2 amazon-s3 amazon-web-services aws-sdk

通常,当文件必须上传到s3时,必须先将其写入磁盘,然后再使用TransferManager api之类的文件上传到云。如果上传未按时完成,则会导致数据丢失(应用程序关闭并在其他服务器上重启等)。因此,我想知道是否可以通过所需的云位置作为接收器直接通过网络写入流。

svo*_*l13 6

令人惊讶的是,这在标准 Java SDK 中是不可能的(在撰写本文时)。无论如何,多亏了这个3rd 方库,您至少可以避免将大量数据缓冲到内存或磁盘,因为它在内部缓冲了大约 5MB 的部分,并在分段上传中自动为您上传。

SDK 存储库中也有github 问题打开,您可以关注以获取更新。


小智 5

您没有说使用什么语言,但是我将根据您的大小写来假定Java。在这种情况下,答案是肯定的:TransferManager有一个upload()方法采用PutObjectRequest,您可以围绕流构造该对象。

但是,有两个重要警告。第一个是在PutObjectRequest的文档中:

直接从输入流上传时,必须指定内容长度,然后才能将数据上传到Amazon S3

因此,在开始之前,您必须知道要上传多少数据。如果您从网上收到一个上传文件并有Content-Length标题,则可以从中获取文件大小。如果您只是读取任意长的数据流,则必须先将其写入文件(否则SDK会这样做)。

第二个警告是,这实际上并不能防止数据丢失:您的程序在读取数据的过程中仍然可能崩溃。它将阻止的一件事是在将数据存储在S3中之前,将成功代码返回给用户,但是您仍然可以使用文件来完成此操作。