Вопросы

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

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

Как извлечь индексы ввода-вывода позиции из текстового токенизатора huggingface transformer?

admin

Symfony и easyadmin: как работать с зависимыми объектами?

admin

Как автоматически обновлять пакеты NuGet до последней доступной версии

admin

Почему моя игра pygame теряет кадры при отображении прямоугольников?

admin

Невозможно установить библиотеку gittle без прав root

admin

Flask-WTForms Как обойти автоматическую предварительную проверку для радиополей

admin