Многоуровневая загрузка Amazon S3 с использованием низкоуровневого java API загружает только одну часть

#amazon-s3 #aws-sdk-java

#amazon-s3 #aws-sdk-java

Вопрос:

Я написал следующий код для загрузки строк коллекции в S3 с использованием multipart upload (каждая часть больше 5 МБ), но когда я загружаю его обратно из S3, он содержит только строки из одной части.

 import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class LowLevelMultipartUpload {

    private List<PartETag> partETags = new ArrayList<>();
    private InitiateMultipartUploadResult initResponse;
    AmazonS3 s3Client; String bucketName; String keyName;

    public LowLevelMultipartUpload(AmazonS3 s3Client, String bucketName, String keyName) {
        this.s3Client = s3Client;
        this.bucketName = bucketName;
        this.keyName = keyName;
        InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, keyName);
        initResponse = s3Client.initiateMultipartUpload(initRequest);
    }

    public void uploadPart(int partNumber, InputStream is, ObjectMetadata objectMetadata, boolean isFinalPart) throws IOException {
        // Create the request to upload a part.
        UploadPartRequest uploadRequest = new UploadPartRequest()
                .withBucketName(bucketName)
                .withKey(keyName)
                .withUploadId(initResponse.getUploadId())
                .withPartNumber(partNumber)
                .withInputStream(is)
                .withPartSize(is.available())
                .withObjectMetadata(objectMetadata);

        if(isFinalPart) uploadRequest.withLastPart(true);

        // Upload the part and add the response's ETag to our list.
        UploadPartResult uploadResult = s3Client.uploadPart(uploadRequest);
        partETags.add(uploadResult.getPartETag());
    }

    public void completeUpload() {
        // Complete the multipart upload.
        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, keyName,
                initResponse.getUploadId(), partETags);
        s3Client.completeMultipartUpload(compRequest);
    }
}
 

Я вызываю приведенный выше код в следующем порядке.

  1. Создайте объект LowLevelMultipartUpload
  2. Загрузка частей в цикле
  3. Вызовите полную загрузку

Ответ №1:

В приведенном выше коде нет проблем, он работает нормально.

Комментарии:

1. Означает ли это, что ваша проблема решена? Или у вас все еще возникают проблемы при загрузке?