使用亚马逊提供的模板代码(https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html低级java)完成多部分上传时,它适用于较小的文件,但在第二次迭代后的那一刻,((ByteArrayInputStream) inputStream).pos
=的值15xxxxx
,而根据我们需要在UploadPartRequest
=中设置的内容计算的文件位置10xxxxx
。
我证实这很奇怪,因为在第一次迭代之后,这两个值相互匹配。我还验证了零件尺寸没有任何不同。
编码:
long partSize;
long filePosition = 0;
long contentLength = formContent.length;
List<PartETag> partETags = new ArrayList<>();
InputStream inputStream = new ByteArrayInputStream(formContent);
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucket, fileName, metadata);
InitiateMultipartUploadResult initResponse = s3Client.initiateMultipartUpload(initRequest);
for (int i = 1; filePosition < contentLength; i++) {
// STD_PART_SIZE = 5242880L
partSize = Math.min(STD_PART_SIZE, (contentLength - filePosition));
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket)
.withKey(fileName)
.withUploadId(initResponse.getUploadId())
.withPartNumber(i)
.withFileOffset(filePosition)
.withInputStream(inputStream)
.withPartSize(partSize);
UploadPartResult uploadResult = s3Client.uploadPart(uploadRequest); // FAILS HERE
partETags.add(uploadResult.getPartETag());
filePosition += partSize;
}
// complete the whole upload process to associate all parts to the object
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucket, fileName, initResponse.getUploadId(), partETags);
s3Client.completeMultipartUpload(completeMultipartUploadRequest);
对此的任何想法或建议将不胜感激。我对 InputStreams 不太熟悉,所以也许我在那里遗漏了什么?