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

使用AWS Java SDK上传含非拉丁字符文件至S3遇签名不匹配错误

解决AWS Java SDK上传含非拉丁字符文件名到S3的403签名错误

当使用AWS Java SDK上传包含非拉丁字符的文件名到S3时,出现SignatureDoesNotMatch的403错误,但纯拉丁字符文件名上传正常,手动URL编码也无效,问题根源在于签名计算对非ASCII字符的处理逻辑。以下是具体解决方案:

问题原因

AWS签名版本4(SigV4)要求对请求中的非ASCII字符先做UTF-8编码,再进行URL编码。若客户端未使用SigV4签名,或手动对文件名做URL编码导致重复编码,都会触发签名不匹配的错误。

解决方案

1. 强制使用SigV4签名算法

部分S3区域默认可能采用旧版签名,需显式配置客户端使用SigV4:

// AWS SDK for Java 1.x
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.YOUR_REGION) // 替换为你的存储桶区域
    .withCredentials(new DefaultAWSCredentialsProviderChain())
    .withClientConfiguration(new ClientConfiguration()
        .withSignerOverride("AWSS3V4SignerType"))
    .build();

如果使用AWS SDK for Java 2.x,配置方式如下:

// AWS SDK for Java 2.x
S3Client s3 = S3Client.builder()
    .region(Region.YOUR_REGION)
    .credentialsProvider(DefaultCredentialsProvider.create())
    .serviceConfiguration(config -> config.signingAlgorithm(SigningAlgorithm.SIGNING_V4))
    .build();

2. 避免手动URL编码文件名

AWS Java SDK会自动处理文件名的UTF-8编码和URL编码,手动编码会导致重复处理,引发签名错误。直接传入原始文件名即可。

3. 确保元数据的UTF-8编码

用户元数据中的fileName字段无需手动编码,直接传入原始字符串,SDK会自动处理元数据的编码规范。

修改后的示例代码

ObjectMetadata metadata = new ObjectMetadata();
// 直接传入原始文件名,SDK自动处理编码
metadata.setUserMetadata(Collections.singletonMap("fileName", fileName));
metadata.setContentType(mediaType);
metadata.setContentLength(content.length);
logger.info("Uploading file {}...", fileName);

// 配置SigV4签名的S3客户端
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_EAST_1) // 替换为实际区域
    .withCredentials(new DefaultAWSCredentialsProviderChain())
    .withClientConfiguration(new ClientConfiguration().withSignerOverride("AWSS3V4SignerType"))
    .build();

s3.putObject(bucket, fileName, fileContent, metadata);
logger.info("Done");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:50:26