通常,当必须将文件上传到s3时,必须先将其写入磁盘,然后再使用TransferManager api之类的文件上传到云。如果上传未按时完成,则会导致数据丢失(应用程序关闭并在其他服务器上重启等)。因此,我想知道是否可以通过所需的云位置作为接收器直接通过网络写入流。
答案 0 :(得分:2)
您没有说您使用的是哪种语言,但是我将根据您的大小写来假定Java。在这种情况下,答案是肯定的:TransferManager
有一个upload()
的{{1}}方法,您可以围绕流构造该对象。
但是,有两个重要警告。首先是PutObjectRequest的文档中:
直接从输入流上传时,必须指定内容长度,然后才能将数据上传到Amazon S3
因此,在开始之前,您必须知道要上传多少数据。如果您是从网上收到的上传文件,并且标题为PutObjectRequest
,则可以从中获取文件大小。如果您只是在读取任意长的数据流,则必须先将其写入文件(否则SDK会这样做)。
第二个警告是,这实际上并不能防止数据丢失:您的程序在读取数据的过程中仍然可能崩溃。 将阻止的一件事是在将数据存储到S3中之前,将成功代码返回给用户,但是您仍然可以使用文件来完成此操作。
答案 1 :(得分:0)
令人惊讶的是,使用标准Java SDK不可能(在撰写本文时)。无论如何,多亏了3rd party library,您可以避免将大量数据缓冲到内存或磁盘上,因为它在内部缓冲了约5MB的部分并自动within multipart为您上传。
SDK存储库中还有github issue open,可以跟随它获取更新。
答案 2 :(得分:0)
有可能:
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.build();
s3Client.putObject("bucket", "key", youtINputStream, s3MetData)