【问题标题】:How to wait the main thread until the AWS S3 file upload finished如何等待主线程直到 AWS S3 文件上传完成
【发布时间】:2020-02-12 23:10:38
【问题描述】:

根据一些用户输入,我想将一些图像(大约 10-15 个)上传到 AWS S3 存储桶。完成后,前端应将上传的图像显示给客户端。

但是根据我目前的实现,在将图像上传到 S3 存储桶之前,前端页面正在从后端获取响应。

我正在使用以下代码部分将文件上传到 S3。

      AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();

      ObjectMetadata putObjectMetaData = new ObjectMetadata();
      putObjectMetaData.setContentType(contentType);

      PutObjectRequest putObject =
          new PutObjectRequest(s3BucketPath, fileName, fileStream, new ObjectMetadata())
              .withCannedAcl(CannedAccessControlList.PublicRead);
      putObject.setMetadata(putObjectMetaData);

      PutObjectResult result = s3Client.putObject(putObject);

据我了解,S3 上传是在一个单独的线程中进行的。有没有办法从同一个主线程进行 S3 上传。或者有没有其他方法可以等到 S3 上传完成?

非常感谢您的回复。

【问题讨论】:

    标签: java amazon-web-services amazon-s3


    【解决方案1】:

    您可以尝试传输管理器[1]。完整示例在这里[2]。

    
    import com.amazonaws.AmazonServiceException;
    import com.amazonaws.services.s3.transfer.MultipleFileUpload;
    import com.amazonaws.services.s3.transfer.TransferManager;
    import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
    import com.amazonaws.services.s3.transfer.Upload;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Arrays;
    
    -----------------------------------
    
    File f = new File(file_path);
    TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
    try {
        Upload xfer = xfer_mgr.upload(bucket_name, key_name, f);
        // loop with Transfer.isDone()
        XferMgrProgress.showTransferProgress(xfer);
        //  or block with Transfer.waitForCompletion()
        XferMgrProgress.waitForCompletion(xfer);
    } catch (AmazonServiceException e) {
        System.err.println(e.getErrorMessage());
        System.exit(1);
    }
    xfer_mgr.shutdownNow();
    
    

    [1]https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-transfermanager.html [2]https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrUpload.java

    【讨论】:

    • 根据您的建议,我使用了下面的代码 TransferManager transferManager = TransferManagerBuilder.standard().build(); ObjectMetadata putObjectMetaData = new ObjectMetadata(); putObjectMetaData.setContentType(contentType);上传 transferMangerUpload = transferManager.upload(s3BucketPath, fileName, fileStream, putObjectMetaData); UploadResult 结果 = transferMangerUpload.waitForUploadResult();但我在 S3 存储桶中找不到任何图像。我的代码有问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2012-07-22
    • 2020-09-21
    相关资源
    最近更新 更多