如何在Amazon S3 Transfer Manager v2.x中为批量上传文件设置元数据?
Amazon S3 Transfer Manager v2.x 批量上传目录并自定义文件元数据
Transfer Manager v2.x 版本的API设计和1.x不同,取消了直接传入元数据处理器的参数,需要通过**自定义FileUploadRequestProvider**为每个生成的PutObjectRequest设置元数据,以此实现和1.x版本相同的效果。
完整实现代码
import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.transfer.s3.FileUploadRequestProvider; import software.amazon.awssdk.transfer.s3.MultipleFileUpload; import software.amazon.awssdk.transfer.s3.UploadDirectoryRequest; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.services.s3.model.ObjectMetadata; import java.io.File; import java.nio.file.Files; public class S3DirectoryUpload { public static void main(String[] args) { String bucketName = "your-bucket-name"; String prefix = "your-prefix/"; File sourceDir = new File("/path/to/your/directory"); // 初始化Transfer Manager(v2版本) try (S3TransferManager transferManager = S3TransferManager.create()) { // 自定义请求提供者,处理每个文件的元数据 FileUploadRequestProvider requestProvider = fileAndKey -> { File file = fileAndKey.file(); String s3Key = fileAndKey.s3Key(); ObjectMetadata metadata = new ObjectMetadata(); String mimeType = "application/json"; try { mimeType = Files.probeContentType(file.toPath()); if (mimeType == null) { String filePath = file.getAbsolutePath(); if (filePath.contains("bulkdata") || filePath.contains(".raw")) { mimeType = "application/octet-stream"; } else if (filePath.contains("frames")) { mimeType = "multipart/related"; } else if (filePath.contains("thumbnail")) { mimeType = "image/jpeg"; } } } catch (Exception ex) { mimeType = "application/octet-stream"; } // 处理gzip压缩文件 if (file.getName().endsWith(".gz")) { metadata.setContentEncoding("gzip"); mimeType = "application/json"; } metadata.setContentType(mimeType); // 构建带自定义元数据的PutObjectRequest return PutObjectRequest.builder() .bucket(bucketName) .key(s3Key) .metadata(metadata) .build(); }; // 构建目录上传请求 UploadDirectoryRequest uploadRequest = UploadDirectoryRequest.builder() .bucket(bucketName) .prefix(prefix) .source(sourceDir) .followSymbolicLinks(true) // 对应1.x中的第四个参数true .fileUploadRequestProvider(requestProvider) .build(); // 执行上传并等待完成 MultipleFileUpload upload = transferManager.uploadDirectory(uploadRequest); upload.completionFuture().join(); System.out.println("目录上传完成"); } } }
关键说明
FileUploadRequestProvider是v2版本中用于自定义单个文件上传请求的核心接口,它会为每个待上传文件生成对应的PutObjectRequest,你可以在这里完全自定义元数据、存储类别等参数。followSymbolicLinks(true)对应1.x版本uploadDirectory方法中的第四个布尔参数,用于控制是否跟随符号链接。- 如果需要异步处理上传结果,可以通过
upload.completionFuture().thenAccept(...)添加回调逻辑,而非直接调用join()阻塞线程。 - 确保你的项目依赖了正确版本的S3 Transfer Manager,例如Maven依赖:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> <version>2.25.0</version> <!-- 使用最新稳定版本 --> </dependency>
内容的提问来源于stack exchange,提问作者aGO
相关产品推荐
相关产品推荐

