Вопросы

Многокомпонентная загрузка 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. Вызов завершить загрузку
Читать:
Моя Анаконда внезапно перестала работать

Похожие записи

Переместить код исходного файла группы в определенный раздел сценария компоновщика

admin

Как отменить изменения в Git?

admin

WPF UserControls: имейте команду, которая доступна только внутри UserControl.

admin

Управление планом тестирования TFS в отношении новой итерации

admin

Присвоение во время выполнения Airflow 1.9 приоритетных весов для DagRuns

admin

Запуск JupyterQ из Anaconda Navigator

admin