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
相关产品推荐
相关产品推荐

