为何AWS S3使用多级相对路径Key上传时会触发400无效URI错误?
AWS S3 Key含多级
../报错的原因解析 虽然AWS S3文档明确说明,对象的Key只是字符串,并非真正的文件系统路径,但你代码里的两种情况出现不同结果,核心原因在于AWS Java SDK的客户端侧校验逻辑:
- 对于
a/../test.json,SDK会自动做路径规范化处理,解析后得到test.json——这是一个合法的S3 Key,因此请求能正常发送并执行。 - 对于
a/../../test.json,解析后会得到../test.json,此时SDK认为这个Key对应的路径超出了存储桶的“根目录”范围,属于无效的URI格式,直接在客户端触发校验错误,返回400 Invalid URI。
本质上,S3本身允许几乎任意合法字符串作为Key(只要符合字符长度和字符集要求),但AWS Java SDK为了避免生成不符合HTTP规范的请求URI,会提前对包含相对路径的Key做解析校验,一旦解析结果出现指向根目录外的结构,就会拦截请求并报错。
如果确实需要使用包含../的字符串作为Key,你需要直接传入不会被解析为“超出根目录”的Key值,或者手动处理路径后再传入(比如确保解析后的Key是合法的非相对路径形式)。
测试代码
import com.amazonaws.PredefinedClientConfigurations; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import java.io.File; public class S3Test { public static void main(String[] args) { AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard() .withClientConfiguration( PredefinedClientConfigurations.defaultConfig().withMaxErrorRetry(10).withRequestTimeout(30_000)) .withCredentials(new ProfileCredentialsProvider("myprofile")) .withRegion("us-east-1") .build(); File file = new File("test.json"); System.out.println("Start upload1"); // 此代码可正常运行,解析后Key为test.json amazonS3.putObject("mybucket", "a/../test.json", file); System.out.println("Start upload2"); // 此代码失败,解析后Key为../test.json,触发SDK的URI校验错误 amazonS3.putObject("mybucket", "a/../../test.json", file); } }
内容的提问来源于stack exchange,提问作者user361676
相关产品推荐
相关产品推荐

