You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:41:21