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

如何通过AWS SDK的MultipleFileUpload接口上传带统一标签的目录至S3桶?

在使用TransferManager上传目录时为S3文件添加标签的解决方案

TransferManager的uploadDirectory方法并没有直接提供批量添加对象标签的参数,要实现上传目录时给所有子文件加标签,你需要手动遍历目录中的每个文件,为每个文件创建带标签的PutObjectRequest,再通过TransferManager逐个上传。

具体实现步骤

  • 遍历本地目录下的所有文件(包括子目录)
  • 对每个文件构建PutObjectRequest,并通过setTagging方法添加自定义标签
  • 使用TransferManager的upload方法上传单个文件,收集所有上传任务后统一等待完成

示例代码

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectTagging;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.Tag;
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.List;

public class S3DirectoryUploadWithTags {

    public static void uploadDirectoryWithTags(AmazonS3 s3Client, String bucketName, String targetFolder, File sourceRootFolder) {
        TransferManager xfer_mgr = TransferManagerBuilder.standard().withS3Client(s3Client).build();
        List<Upload> uploadTasks = new ArrayList<>();

        // 递归遍历源目录下的所有文件
        walkDirectory(sourceRootFolder, sourceRootFolder, bucketName, targetFolder, xfer_mgr, uploadTasks);

        // 等待所有上传任务完成
        for (Upload task : uploadTasks) {
            try {
                task.waitForCompletion();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        xfer_mgr.shutdownNow();
    }

    private static void walkDirectory(File currentFile, File sourceRoot, String bucketName, String targetFolder, TransferManager xferMgr, List<Upload> uploadTasks) {
        if (currentFile.isDirectory()) {
            File[] files = currentFile.listFiles();
            if (files != null) {
                for (File file : files) {
                    walkDirectory(file, sourceRoot, bucketName, targetFolder, xferMgr, uploadTasks);
                }
            }
            return;
        }

        // 计算文件在S3中的对象键,保留原目录结构
        String relativePath = sourceRoot.toURI().relativize(currentFile.toURI()).getPath();
        String s3ObjectKey = targetFolder.endsWith("/") ? targetFolder + relativePath : targetFolder + "/" + relativePath;

        // 定义要添加的标签
        ObjectTagging fileTags = new ObjectTagging(List.of(
                new Tag("category", "documents"),
                new Tag("uploaded-by", "admin")
        ));

        // 构建带标签的上传请求
        PutObjectRequest putRequest = new PutObjectRequest(bucketName, s3ObjectKey, currentFile)
                .withTagging(fileTags);

        // 提交上传任务并加入列表
        Upload upload = xferMgr.upload(putRequest);
        uploadTasks.add(upload);
        // 可选:显示单个文件上传进度
        // XferMgrProgress.showTransferProgress(upload);
    }

    // 调用示例
    public static void main(String[] args) {
        AmazonS3 s3Client = getAmazonS3Client(); // 替换为你的S3客户端初始化逻辑
        uploadDirectoryWithTags(s3Client, "your-bucket-name", "target-s3-folder", new File("/local/source/directory"));
    }
}

关键说明

  • ObjectTagging用于封装文件的标签集合,每个标签由Tag键值对对象组成
  • 遍历目录时通过相对路径计算S3对象键,保证上传后目录结构与本地一致
  • 大文件分块上传无需额外处理,TransferManager会自动应用标签到最终的S3对象
  • 可根据需求修改标签内容、添加文件过滤逻辑(如仅上传特定后缀的文件)

内容的提问来源于stack exchange,提问作者Nitin Alety

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:30:51