当前位置: 首页 > 知识库问答 >
问题:

使用TransferManager将大文件上载到AmazonS3存储桶的最佳方法

鞠侯林
2023-03-14

目前,我正在尝试将一个文件上载到AmazonS3存储桶,我对此进行了一些研究,发现如果文件足够大,类TransferManager会将文件拆分为小块,然后使用多个线程并行上载。现在在应用程序中,我们正在创建一个AmazonS3客户端实例(在应用程序开始时创建的一个bean),并使用该AmazonS3客户端为用户上传文件所需的每个文件创建TransferManager类实例,文件上传完成后(由TransferManager的waitForCompletion方法检查),我们将调用TransferManager方法。shutdownNow(false)关闭它创建的所有线程,如下所示:

@AutoWired
private AmazonS3 s3Client;


   /**
 * Uploads a file using TransferManager from a MultipartFile.
 */
public String uploadFileParallelized(MultipartFile file) {
  String fileName;
  TransferManager transferManager =
      TransferManagerBuilder.standard().withS3Client(this.s3Client).build();

  try {
    String extension = getExtensionFromBytes(file.getBytes());
    fileName = getFileName(extension);

    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(file.getSize());
    metadata.setContentType(file.getContentType());

    Upload upload = transferManager.upload(getBucketName(), this.folder + fileName,
        file.getInputStream(), metadata);
    upload.waitForCompletion();
  } catch (IOException | AmazonClientException | InterruptedException e) {
    throw new FileUploadException("Couldn't upload the file to S3: " + e.getLocalizedMessage(),
        e);
  } finally {
    transferManager.shutdownNow(false);
  }


  return fileName;
}

我仍然有疑问:

>

  • 我不确定您是否应该为每个上传实例化一个transferManager,或者我们应该只使用TransferManager的一个实例(可能是bean),但在这种情况下,我将无法调用transferManager.shutdownNow(false)方法原因我将无法使用它进行第二次上传。

    即使我没有调用shutdownNow方法,TransferManager是否会关闭用于上载文件的所有线程?

    是否可以使用同一个Amazon S3客户端来创建TransferManager的多个实例,或者我们应该为我们需要的每个TransferManager创建一个S3Client?

    即使文件很小(比如小于5MB),我们是否也应该使用TransferManager

  • 共有1个答案

    景鹏飞
    2023-03-14

    https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html

    >

    TransferManager负责管理连接和线程等资源;尽可能共享TransferManager的单个实例。TransferManager与AWS SDK for Java中的所有客户端类一样,是线程安全的。打电话给经理。shutdownNow()以在传输完成后释放资源。

    默认情况下,当传输管理器实例被垃圾收集时,线程池将关闭。

    您应该使用相同的S3客户机。它是线程安全的。

    minUploadPartSize为5MB,而minUploadThresholdSize为16MB。您可以使用TransferManager对所有文件进行上传,它将根据文件大小对文件进行分解。这些选项是可配置的。如果您知道所有文件都相对较小,那么使用putObject可能会更容易。

     类似资料:
    • 我有一个要求,我需要上传文件到谷歌云存储(他拥有并完全维护它)桶。 这个谷歌云存储桶是由我的客户创建的。 我是谷歌云的新手,有亚马逊S3的经验。我在服务器上运行SSI,以将事务数据加载到平面文件。 我为谷歌云创建了一个示例帐户,并安装了谷歌SDK。我可以通过gsutil手动上传文件。 我的问题是 > 我应该如何建议我的客户共享凭据? 我如何连接到谷歌云存储与提供凭据独立? 如何通过以上两个步骤将文

    • 我需要一些帮助,以便从 salesforce 顶点服务器端将大文件上传到 s3 存储桶中。 我需要能够使用Http PUT操作拆分一个blob并将其上传到aws s3 bucket。我能够在一次上传中完成高达12MB的文件,因为这是Apex中PUT请求正文大小的限制。所以我需要能够使用多部分操作上传。我注意到s3允许部分上传并返回uploadId。想知道之前是否有人在salesforceapex代

    • 但事实证明,Firebase无法从服务器端上传文件,正如它在文档中明确说明的那样: Firebase存储不包括在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户机。 我的第二次尝试是使用库,就像文档中提到的:

    • 如果有人帮我解决这个问题,我会非常感激。 我正在为我的项目使用codeigniter框架。并想将我的图像上传到amazon s3桶中。当我尝试使用S3.php文件时 string(92)“不支持您提供的授权机制。请使用AWS4-HMAC-SHA256。” 有人能帮我解决这个问题吗。

    • 目前我正在使用pdfbox下载我服务器上的所有pdf文件,然后使用pdfbox将它们合并在一起。它的工作非常好,但它非常慢--因为我必须下载所有的。 有没有一种方法可以直接在S3上执行所有这些?我正在试图找到一种方法来实现它,即使不是在Java也是在python中,也无法做到这一点。 我读到了以下内容: 在S3 Amazon上合并文件 null null 编辑 最后我使用 并用 实现它。我设置了最