0

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

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

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

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

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

我们只进行了一次调用,那么我们如何通知 S3 我们现在已经开始从 s3ObjectInputStream 读取。在我们从流中读取之前,实际文件存储在哪里?

4

1 回答 1

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 字节序列在 headers 中是无效的,并且在 headers 之后是强制性的,因此 SDK 只是在 S3 的响应中停止提取 headers 并构建并返回响应对象,您可以从中读取流中的正文网络。

于 2018-05-04T01:37:43.560 回答