Amazon S3 Transfer Manager

您所在的位置:网站首页 java文件上传进度条 Amazon S3 Transfer Manager

Amazon S3 Transfer Manager

2024-01-18 01:11| 来源: 网络整理| 查看: 265

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 Transfer Manager

Amazon S3 Transfer Manager 是一款开源的高级文件传输工具,用于AWS SDK for Java 2.x。使用它来往亚马逊简单存储服务 (Amazon S3) 和从亚马逊简单存储服务 (Amazon S3) 传输文件和目录。

在的基础上构建时AWS基于CRT的S3客户端,S3 传输管理器可以利用性能改进,例如分段上传 API 和字节范围提取。

使用 S3 传输管理器,您还可以实时监控传输进度,并暂停传输以备日后执行。

开始使用 将依赖项添加到您的构建文件中

要使用基于基于 AWS CRT 的 S3 客户端的性能增强的 S3 传输管理器,请使用以下依赖项配置您的构建文件。

使用适用于 Java 的 SDK 2.19.1 或更高版本 2. x。

将s3-transfer-manager构件添加为依赖项。

在 0.20.3 或更高版本中将aws-crt构件作为依赖项添加。

以下代码示例显示了如何为 Maven 配置项目依赖关系。

2.19.1 software.amazon.awssdk bom ${aws.sdk.version} pom import software.amazon.awssdk s3-transfer-manager software.amazon.awssdk.crt aws-crt 0.20.3

在 Maven 中央存储库中搜索 s3-transfer-Manager 和 aws- crt 工件的最新版本。

创建 S3 传输管理器的实例

以下代码段显示了如何使用默认设置创建 S3 TransferManager 实例。

S3TransferManager transferManager = S3TransferManager.create();

以下示例说明如何使用自定义设置配置 S3 传输管理器。在此示例中,AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端。

S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_EAST_1) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * MB) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build(); 注意

如果构建文件中未包含aws-crt依赖关系,则 S3 传输管理器将在适用于 Java 的 SDK 2.x 中使用的标准 S3 异步客户端的基础上构建。

将文件上传到 S3 存储桶

要使用 S3 传输管理器将文件上传到 Amazon S3,请将UploadFileRequest对象传递给S3TransferManager的 uploadFile 方法。

从该uploadFile方法返回的FileUpload对象表示上传过程。请求完成后,该CompletedFileUpload对象将包含有关上传的信息。

以下示例显示了文件上传示例 LoggingTransferListener,以及记录上传进度的可选用法。

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.net.URL; import java.nio.file.Paths; import java.util.UUID; public String uploadFile(S3TransferManager transferManager, String bucketName, String key, String filePath) { UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(b -> b.bucket(bucketName).key(key)) .addTransferListener(LoggingTransferListener.create()) .source(Paths.get(filePath)) .build(); FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); return uploadResult.response().eTag(); } 从 S3 存储桶下载文件

要使用 S3 传输管理器从 S3 存储桶下载对象,请生成一个DownloadFileRequest对象并将其传递给 downloadFile 方法。

的downloadFile方法返回S3TransferManager的FileDownload对象表示文件传输。下载完成后,CompletedFileDownload包含对下载相关信息的访问权限。

以下示例还显示了下载示例以及记录下载进度的可选用法。LoggingTransferListener

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload; import software.amazon.awssdk.transfer.s3.model.DownloadFileRequest; import software.amazon.awssdk.transfer.s3.model.FileDownload; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.util.UUID; public Long downloadFile(S3TransferManager transferManager, String bucketName, String key, String downloadedFileWithPath) { DownloadFileRequest downloadFileRequest = DownloadFileRequest.builder() .getObjectRequest(b -> b.bucket(bucketName).key(key)) .addTransferListener(LoggingTransferListener.create()) .destination(Paths.get(downloadedFileWithPath)) .build(); FileDownload downloadFile = transferManager.downloadFile(downloadFileRequest); CompletedFileDownload downloadResult = downloadFile.completionFuture().join(); logger.info("Content length [{}]", downloadResult.response().contentLength()); return downloadResult.response().contentLength(); } 将 Amazon S3 对象复制到另一个存储桶

要开始将对象从 S3 存储桶复制到另一个存储桶,请创建一个基本CopyObjectRequest实例。

接下来,将基本内容封装CopyObjectRequest在 S3 传输管理器可以使用的文件中。CopyRequest

的copy方法返回S3TransferManager的Copy对象表示复制过程。复制过程完成后,该CompletedCopy对象将包含有关响应的详细信息。

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.CopyObjectRequest; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedCopy; import software.amazon.awssdk.transfer.s3.model.Copy; import software.amazon.awssdk.transfer.s3.model.CopyRequest; import java.util.UUID; public String copyObject(S3TransferManager transferManager, String bucketName, String key, String destinationBucket, String destinationKey){ CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder() .sourceBucket(bucketName) .sourceKey(key) .destinationBucket(destinationBucket) .destinationKey(destinationKey) .build(); CopyRequest copyRequest = CopyRequest.builder() .copyObjectRequest(copyObjectRequest) .build(); Copy copy = transferManager.copy(copyRequest); CompletedCopy completedCopy = copy.completionFuture().join(); return completedCopy.response().copyObjectResult().eTag(); } 注意

目前不支持跨区域复制。

将本地目录上传到 S3 存储桶

要将本地目录上传到 S3 存储桶,请首先调用S3TransferManager实例的 uploadDirectory 方法,然后传入。UploadDirectoryRequest

该DirectoryUpload对象表示上传过程,该过程会在请求完成CompletedDirectoryUpload时生成。该CompleteDirectoryUpload对象包含有关传输结果的信息,包括哪些文件传输失败。

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryUpload; import software.amazon.awssdk.transfer.s3.model.DirectoryUpload; import software.amazon.awssdk.transfer.s3.model.UploadDirectoryRequest; import java.net.URL; import java.nio.file.Paths; import java.util.UUID; public Integer uploadDirectory(S3TransferManager transferManager, String sourceDirectory, String bucketName){ DirectoryUpload directoryUpload = transferManager.uploadDirectory(UploadDirectoryRequest.builder() .source(Paths.get(sourceDirectory)) .bucket(bucketName) .build()); CompletedDirectoryUpload completedDirectoryUpload = directoryUpload.completionFuture().join(); completedDirectoryUpload.failedTransfers().forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryUpload.failedTransfers().size(); } 将 S3 存储桶对象下载到本地目录

要将 S3 存储桶中的对象下载到本地目录,请首先调用传输管理器的 downloadDirectory 方法,传入。DownloadDirectoryRequest

该DirectoryDownload对象表示下载过程,该过程会在请求完成CompletedDirectoryDownload时生成。该CompleteDirectoryDownload对象包含有关传输结果的信息,包括哪些文件传输失败。

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DownloadDirectoryRequest; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashSet; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; public Integer downloadObjectsToDirectory(S3TransferManager transferManager, String destinationPath, String bucketName) { DirectoryDownload directoryDownload = transferManager.downloadDirectory(DownloadDirectoryRequest.builder() .destination(Paths.get(destinationPath)) .bucket(bucketName) .build()); CompletedDirectoryDownload completedDirectoryDownload = directoryDownload.completionFuture().join(); completedDirectoryDownload.failedTransfers().forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryDownload.failedTransfers().size(); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3