如何在GCS中按文件扩展名筛选跨存储桶传输文件?
解决方案
要基于GCS Transfer Service实现按文件扩展名筛选传输,核心是利用glob匹配规则替换原有的时间筛选条件。GCS Transfer Service支持标准的glob模式,可直接匹配文件名后缀。
修改步骤与代码示例
假设你原代码中构建GcsTransferSpec的部分包含时间筛选逻辑,只需替换为以下扩展名匹配逻辑:
import com.google.cloud.storage.transfer.v1.TransferServiceClient; import com.google.cloud.storage.transfer.v1.GcsTransferSpec; import com.google.cloud.storage.transfer.v1.ObjectConditions; import com.google.cloud.storage.transfer.v1.TransferJob; import com.google.cloud.storage.transfer.v1.TransferJob.Status; public class GcsTransferByExtension { public static void main(String[] args) throws Exception { // 初始化Transfer Service客户端 try (TransferServiceClient client = TransferServiceClient.create()) { // 源存储桶配置 GcsTransferSpec gcsTransferSpec = GcsTransferSpec.newBuilder() .setSourceBucket("source-bucket-name") .setSinkBucket("destination-bucket-name") // 关键:设置扩展名匹配的glob规则 .setObjectConditions(ObjectConditions.newBuilder() // 匹配.txt、.pdf、.mp3文件,支持brace扩展语法 .setMatchGlob("*.{txt,pdf,mp3}") .build()) .build(); // 构建传输任务 TransferJob transferJob = TransferJob.newBuilder() .setProjectId("your-project-id") .setTransferSpec(gcsTransferSpec) .setStatus(Status.ENABLED) .build(); // 创建传输任务 TransferJob createdJob = client.createTransferJob(transferJob); System.out.println("Created transfer job: " + createdJob.getName()); } } }
关键说明
- Glob模式写法:
- 单个扩展名:
*.txt匹配所有后缀为.txt的文件 - 多个扩展名:
*.{txt,pdf,mp3}同时匹配三种后缀的文件(GCS支持brace扩展语法) - 注意:glob匹配区分大小写,若需要忽略大小写,需单独指定如
*.TXT、*.txt,或结合额外处理逻辑
- 单个扩展名:
- 移除原时间筛选:确保删除原代码中类似
setMinTimeElapsedSinceLastModification(Duration.newBuilder().setSeconds(30*24*3600).build())的时间条件代码 - 权限验证:确保你的服务账号拥有
roles/storage.transferAdmin权限,以及源桶的storage.objects.list和目标桶的storage.objects.create权限
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

