使用S3文件下载

时间:2018-05-03 18:55:58

标签: amazon-s3 aws-sdk aws-sdk-java-2.0

要使用java SDK从S3下载文件,我们需要执行以下操作 - > 注意 - Multipart下载已关闭。

S3Object s3Object = s3.getObject(getObjectRequest);
S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
//Write to a file from this stream

当我们进行getObject调用时,SDK会对该对象执行GET调用。 此调用仅返回响应的标头。

当我们真正开始从s3ObjectInputStream中读取时,我们得到了响应体。 但这一切都是一个REST调用。

所以,我很困惑,为什么调用首先只返回标题。 S3如何知道何时开始在响应主体中发送?

我们只进行一次调用,所以我们如何通知S3我们现在已经开始从s3ObjectInputStream中读取。 实际文件存储在哪里,直到我们从流中读取它?

1 个答案:

答案 0 :(得分:0)

S3立即开始发送响应正文。

您还没有开始从网络上阅读它。

  

getObject

     

使用此方法时要格外小心;返回的Amazon S3对象包含来自HTTP连接的直接数据流。在用户完成读取数据并关闭流之前,不能重用基础HTTP连接。

     

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#getObject-com.amazonaws.services.s3.model.GetObjectRequest-

少量已缓冲,但对象未存储在任何地方。网络连接已停止。  如果您要在启动请求并等待足够长时间才能读取它,S3最终会检测到连接是否已停顿,放弃并关闭连接。

实际上,很容易将HTTP标头与流中的主体分开,因为它们之间的边界始终是\r\n\r\n。这个4字节序列在标题中是无效的,并且在标题之后是必需的,因此SDK只是在S3的响应中停止提取标题并构建并返回响应对象,您可以从该对象中读取来自网络。