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

Я написал следующий код для загрузки строк коллекции в S3 с использованием многостраничной загрузки (каждая часть больше 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. Вызов завершить загрузку
См. также:  Как получить доступ к кросс-региональной корзине s3 с помощью лямбда-выражения с помощью CDK Python
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Venkky

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

    Значит ли это, что ваша проблема решена? Или у вас все еще проблемы с загрузкой? person Venkky; 07.12.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: