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

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

解决方案:给S3批量上传的文件添加自定义标签

问题分析

TransferManager.uploadDirectory()方法本身没有直接支持为上传文件添加标签的配置项,要实现给目录内所有子文件加标签的需求,需要自定义每个文件的上传请求,通过PutObjectRequest设置标签后,再通过TransferManager批量处理。

实现步骤

  • 遍历本地目录下的所有文件(含子目录)
  • 为每个文件创建PutObjectRequest并配置标签集合
  • 使用TransferManager.upload()方法批量提交上传请求,同时跟踪进度

代码示例

import com.amazonaws.services.s3.AmazonS3;
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 S3UploadWithTags {

    public void uploadDirectoryWithTags(String bucketName, String targetPrefix, File sourceDir, AmazonS3 s3Client) {
        TransferManager xfer_mgr = TransferManagerBuilder.standard().withS3Client(s3Client).build();
        List<Upload> uploads = new ArrayList<>();

        // 定义要添加的标签集合
        List<Tag> tags = new ArrayList<>();
        tags.add(new Tag("category", "documents"));
        tags.add(new Tag("uploaded-by", "system"));

        // 递归遍历本地目录
        traverseDirectory(sourceDir, targetPrefix, bucketName, xfer_mgr, uploads, tags);

        // 统一跟踪所有上传任务的进度并等待完成
        for (Upload upload : uploads) {
            XferMgrProgress.showTransferProgress(upload);
            XferMgrProgress.waitForCompletion(upload);
        }

        xfer_mgr.shutdownNow();
    }

    private void traverseDirectory(File currentDir, String currentPrefix, String bucketName, TransferManager xfer_mgr, List<Upload> uploads, List<Tag> tags) {
        File[] files = currentDir.listFiles();
        if (files == null) return;

        for (File file : files) {
            if (file.isDirectory()) {
                // 处理子目录,更新S3路径前缀
                String newPrefix = currentPrefix + file.getName() + "/";
                traverseDirectory(file, newPrefix, bucketName, xfer_mgr, uploads, tags);
            } else {
                // 构造S3对象键
                String s3Key = currentPrefix + file.getName();
                // 创建带标签的上传请求
                PutObjectRequest putRequest = new PutObjectRequest(bucketName, s3Key, file)
                        .withTagging(new com.amazonaws.services.s3.model.ObjectTagging(tags));
                // 提交上传任务并加入跟踪列表
                Upload upload = xfer_mgr.upload(putRequest);
                uploads.add(upload);
            }
        }
    }
}

关键说明

  • 标签配置:通过PutObjectRequest.withTagging()传入ObjectTagging对象,该对象包含一组Tag键值对,可根据业务需求自定义标签内容
  • 目录结构保持:递归遍历本地目录时,同步更新S3的路径前缀,确保上传后的文件结构和本地一致
  • 进度跟踪兼容:复用原有的XferMgrProgress工具类,保持和uploadDirectory()一致的进度展示逻辑
  • 资源释放:上传完成后调用TransferManager.shutdownNow()清理资源

替代方案:上传后批量补加标签

如果已完成文件上传,也可以通过S3的PutObjectTagging接口批量修改已上传文件的标签,但这种方式需要额外发起API请求,效率不如上传时直接设置:

// 示例:给单个已上传文件添加标签
PutObjectTaggingRequest taggingRequest = new PutObjectTaggingRequest(bucketName, s3Key, new ObjectTagging(tags));
s3Client.putObjectTagging(taggingRequest);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:21:37