0

使用亚马逊提供的模板代码(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 不太熟悉,所以也许我在那里遗漏了什么?

4

0 回答 0