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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:20:58