SQS接收S3桶事件消息时等号被转十六进制%3D的问题求助
解决S3事件触发SQS后对象Key被URL编码的问题
这个场景我之前处理过!你遇到的其实是S3发送事件消息时的标准行为——S3会对对象的Key进行URL编码,所以=会被转成%3D。直接用replace('%3D', '=')虽然能解决当前问题,但确实不是最优解,因为它只处理了这一种编码字符,万一以后Key里出现其他需要解码的内容(比如空格变成%20,或者特殊符号被编码),这种硬替换的方式就失效了。
正确的解决方案:使用Python标准库进行URL解码
Python的urllib.parse模块提供了专门的URL解码方法,能处理所有合法的URL编码字符,是更健壮的做法:
导入模块:
import urllib.parse使用
unquote()方法解码:encoded_file_location = '/model/invalid/SourceSystem/20160101/Monthly/SourceSystem/year%3D2018/month%3D01/day%3D02/test.csv' decoded_file_location = urllib.parse.unquote(encoded_file_location) print(decoded_file_location) # 输出:/model/invalid/SourceSystem/20160101/Monthly/SourceSystem/year=2018/month=01/day=02/test.csv
如果你的Key里有可能出现空格被编码成+的情况(虽然S3对象Key里一般不用空格,但以防万一),可以用unquote_plus()方法,它会把+也解码成空格:
decoded_file_location = urllib.parse.unquote_plus(encoded_file_location)
为什么不推荐硬替换?
- 局限性强:只能处理
%3D这一种编码,遇到其他编码字符(比如%2F、%25等)就无能为力了。 - 不符合标准:URL编码是有规范的,用标准库的解码方法才是遵循规范的正确做法,能避免潜在的Bug。
内容的提问来源于stack exchange,提问作者Aviral Vishnoi
相关产品推荐
相关产品推荐

