Загрузка больших файлов из объекта Workbook в хранилище объектов IBM Cloud с помощью Java

#java #amazon-s3 #ibm-cloud #cloud-object-storage

#java #amazon-s3 #ibm-cloud #облачное хранилище объектов

Вопрос:

Я создаю большой файл Excel и при его загрузке с использованием Java SDK для хранилища объектов IBM Cloud я получаю следующее

 com.ibm.cloud.objectstorage.services.s3.model.AmazonS3Exception: Request Entity Too Large (Service: Amazon S3; Status Code: 413; Error Code: 413 Request Entity Too Large; Request ID: null)
 

Что я делаю?
Я создал файл Excel с использованием библиотеки Apache POI, и теперь я хочу передать этот поток вывода объекта в корзину IBM COS. Как я могу этого добиться?

Код с использованием stream

 public boolean uploadWorkbookObjectToBucket(Workbook wb, String fileName) {
    try {
        // converting the workbook to serialized output stream 
        ByteArrayOutputStream theBytes = new ByteArrayOutputStream(); // create a new output stream to store the object data
        ObjectOutputStream serializer = new ObjectOutputStream(theBytes); // set the object data to be serialized
        wb.write(serializer); // serialize the object data
        serializer.flush(); // flushing
        serializer.close(); // closing the serializer
        InputStream stream = new ByteArrayInputStream(theBytes.toByteArray()); // convert the serialized data to a new input stream to store
        
        // creating the metadata to upload the data
        ObjectMetadata metadata = new ObjectMetadata(); // define the metadata
        //metadata.setContentType("application/x-java-serialized-object"); // set the metadata
        //metadata.setContentLength(theBytes.size()); // set metadata for the length of the data stream
    
        PutObjectResult result = cos.putObject(bucketName, fileName, stream, metadata);
        
        if(result != null) {
            return true;
        }
        
    } catch(Exception e) {
        logger.error("Exception while uploading file to bucket using the workbook", e);
    }
    return false;
}
 

Код с использованием диспетчера переноса

 private TransferManager getTransferManager() {
    return  TransferManagerBuilder.standard()
            .withS3Client(cos)
            .withMinimumUploadPartSize(partSize)
            .withMultipartCopyThreshold(thresholdSize)
            .build();
}
public boolean uploadFileUsingTransferManager(Workbook wb, String fileName) throws Exception {
    
    // converting the workbook to serialized output stream 
    ByteArrayOutputStream theBytes = new ByteArrayOutputStream(); // create a new output stream to store the object data
    ObjectOutputStream serializer = new ObjectOutputStream(theBytes); // set the object data to be serialized
    wb.write(serializer); // serialize the object data
    serializer.flush(); // flushing
    serializer.close(); // closing the serializer
    InputStream stream = new ByteArrayInputStream(theBytes.toByteArray()); // convert the serialized data to a new input stream to store
    
    // creating the metadata to upload the data
    ObjectMetadata metadata = new ObjectMetadata(); // define the metadata
    // metadata.setContentType("application/x-java-serialized-object"); // set the metadata
    // metadata.setContentLength(theBytes.size()); // set metadata for the length of the data stream
    
    TransferManager transferManager = getTransferManager();
    
    try {
        Upload transfer = transferManager.upload(bucketName, fileName, stream, metadata);
        transfer.waitForCompletion();
        // transfer.addProgressListener(new P);
        return true;
    } catch(Exception e) {
        logger.error("Exception while uploading file to bucket using the workbook", e);
    } finally {
        transferManager.shutdownNow();
        wb.close();
    }
    
    
    return false;
}
 

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

1. Какого размера файл и можете ли вы показать код, который его загружает?

2. Добавлены мои фрагменты кода