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

Android上传文件至AWS S3时文件名@被替换为%40问题

解决AWS S3上传时文件名中@被转义为%40的问题

嘿,这个问题我之前帮朋友排查过,本质是AWS Android SDK默认会对S3对象键(也就是你说的文件名)做URL编码,@属于URL特殊字符,所以被转成了%40。不过别担心,咱们很容易就能解决这个问题:

问题根源

S3本身是支持把@作为对象键一部分的,但AWS SDK出于URL安全的考虑,默认会对对象键里的特殊字符进行URL编码,这就导致myemail@gmail.com/img-1.jpg被转成了myemail%40gmail.com/img-1.jpg。

解决方案

根据你使用的AWS SDK版本,分两种情况处理:

如果你用的是AWS SDK for Android v2

初始化S3客户端的时候,添加一个配置项禁用URL编码即可:

// 初始化S3专属配置
val s3Config = S3Configuration.builder()
    .disableUrlEncoding(true) // 关键:禁用URL编码
    .build()

// 创建配置好的S3客户端
val s3Client = S3Client.builder()
    .region(Region.YOUR_REGION) // 替换成你的存储桶所在区域
    .serviceConfiguration(s3Config)
    .credentialsProvider(DefaultCredentialsProvider.create())
    .build()

之后用这个配置好的s3Client来构建上传请求(比如PutObjectRequest),或者初始化TransferUtility,上传时对象键里的@就会被原样保留了。

如果你用的是AWS SDK for Android v1(旧版)

在创建AmazonS3Client时,通过配置关闭编码:

AmazonS3Client s3Client = new AmazonS3Client(yourCredentials);
s3Client.setS3ClientOptions(S3ClientOptions.builder()
    .disableUrlEncoding(true) // 禁用URL编码
    .build());

用这个客户端执行上传操作,就能让@字符保持原样。

注意事项

  • 确认你的对象键符合S3规则:长度不超过1024字节,避免使用\、{、}、^等S3明确禁止的字符,@是完全合法的。
  • 如果之前已经上传了转义后的文件,建议删除后重新上传;如果需要保留,下载时可以手动对键名进行URL解码,但前者是更规范的做法。

内容的提问来源于stack exchange,提问作者Wai Yan Hein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:38:41