AWS Java SDK 2 S3 CopyObjectRequest源与目标配置疑问
AWS Java SDK v2 复制对象请求的正确构建方式
太懂这种困惑了!我从AWS Java SDK v1迁到v2的时候也卡在这里——CopyObjectRequest的Builder设计一开始完全摸不着头脑,官方文档和示例也没把这个差异讲清楚,坑死个人!
核心逻辑先搞懂
首先要掰正一个认知:SDK v2里,目标桶和目标键是直接通过CopyObjectRequest.Builder的bucket()和key()方法设置的(这俩参数对应的就是复制操作的最终目标位置);而源对象则是通过copySource()方法来指定,而且你完全不用手动拼接路径或者处理URL编码,SDK有更安全的方式帮你搞定。
两种靠谱的实现方式
方式1:用CopySource构建源(推荐,自动处理编码)
用CopySource构建器来定义源对象,它会自动处理键中的特殊字符编码,避免手动拼接时踩坑:
// 第一步:构建源对象的描述 CopySource source = CopySource.builder() .bucket("你的源桶名称") .key("你的源对象键") // 如果需要复制指定版本的对象,加上这一行即可 // .versionId("源对象的版本ID") .build(); // 第二步:构建复制请求 CopyObjectRequest copyRequest = CopyObjectRequest.builder() .bucket("你的目标桶名称") // 设置目标桶 .key("你的目标对象键") // 设置目标键 .copySource(source) // 关联刚才定义的源对象 .build();
方式2:直接传入源字符串(适合简单场景)
如果你的源对象键没有特殊字符(比如空格、中文、特殊符号),也可以直接拼接源桶名称/源对象键格式的字符串传入copySource():
CopyObjectRequest copyRequest = CopyObjectRequest.builder() .bucket("你的目标桶名称") .key("你的目标对象键") .copySource("你的源桶名称/你的源对象键") .build();
和SDK v1的写法对比
对比你熟悉的v1写法:
// SDK v1 简洁的写法 new CopyObjectRequest(sourceBucket, sourceKey, destinationBucket, destinationKey);
v2其实只是把目标位置拆到了Builder的顶层bucket()/key()方法,源位置统一放到copySource()里,本质的复制逻辑是完全一致的,只是API设计风格变了而已。
当初我也是翻了SDK的源码才搞明白这个对应关系,官方文档确实没把这个差异点明确指出来,希望这个解答能帮你绕开这个坑!
内容的提问来源于stack exchange,提问作者worpet




