【发布时间】:2020-07-04 08:26:27
【问题描述】:
我有一个可能为 20-30mb 的输入流。我正在尝试将块作为多部分文件上传到 S3。
我有可用的内容长度和可用的输入流。考虑到记忆,我怎样才能有效地做到这一点。
我看到有人做过这样的事情,但不确定我是否完全理解:
int contentLength = inputStreamMetadata.getContentLength();
int partSize = 512 * 1024; // Set part size to 2 MB
int filePosition = 0;
ByteArrayInputStream bais = inputStreamMetadata.getInputStream();
List<PartETag> partETags = new ArrayList<>();
byte[] chunkedFileBytes = new byte[partSize];
for (int i = 1; filePosition < contentLength; i++) {
// Because the last part could be less than 5 MB, adjust the part size as needed.
partSize = Math.min(partSize, (contentLength - filePosition));
filePosition += bais.read(chunkedFileBytes, filePosition, partSize);
// Create the request to upload a part.
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucketName)
.withUploadId(uploadId)
.withKey(fileName)
.withPartNumber(i)
.withInputStream(new ByteArrayInputStream(chunkedFileBytes, 0, partSize))
.withPartSize(partSize);
UploadPartResult uploadResult = client.uploadPart(uploadRequest);
partETags.add(uploadResult.getPartETag());
}
}
具体这件作品:.withInputStream(new ByteArrayInputStream(bytes, 0, bytesRead))
【问题讨论】:
-
实际上它与AWS low level API upload doc 对齐...一个区别:示例使用
withFile和withFileOffset,您使用withInputStream(似乎也正确:使用来自当前加载的InputStream块)...一个 tiny 问题,我知道,是 ..最后一次迭代 (bytesRead <= 0) ..但也会测试它的行为方式。 -
API 应该有一种启用分块传输模式的方法,这一切都为您完成。
-
我更新了代码,但是 [message=Range [524288, 524288 + 179947) 超出了长度 524288 的范围,错误。我不知道为什么
-
..但是 20-30mb 的努力(分块)值得吗!? (我在这里遇到了@Stack Overflow 的人,他们通过
putObject增加了 2GB(知道文件大小;)...stackoverflow.com/q/54379555/592355) -
老实说,上传速度对我来说非常缓慢,只有几 mb,但不知道为什么。我原以为这些部分都是并行完成的,但实际上并不这么认为。