Lambda S3事件给出的密钥不能包含非ASCII字符。

3

我有一个Python Lambda脚本,可以在上传到S3时缩小图像。当上传的文件名包含非ASCII字符(例如我这里使用的希伯来语)时,我无法获取该对象(似乎文件不存在,返回Forbidden)。

以下是我的一部分代码:

s3_client = boto3.client('s3')
def handler(event, context):
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        s3_client.download_file(bucket, key, "/tmp/somefile")

这引发了一个错误:调用HeadObject操作时出错(403):禁止访问:ClientError。我还看到日志中的键包含像%D7%92这样的字符。
按照某些来源(http://blog.rackspace.com/the-devnull-s3-bucket-hacking-with-aws-lambda-and-python/)所说,我也尝试对键进行解码,但是没有成功。
key = urllib.unquote_plus(record['s3']['object']['key'])

出现了同样的错误,不过这次日志显示我正在尝试检索具有类似于 פ××§×¡× 这样的字符的键。

请注意,已经验证此脚本可用于英文键,并且测试是在没有空格的键上进行的。


可能是从Lambda中的S3通知事件获取非ASCII文件名的重复内容。 - Alastair McCormack
2个回答

5
#This worked for me
import urllib.parse
encodedStr = 'My+name+is+Tarak'
urllib.parse.unquote_plus(encodedStr)
"My name is Tarak"

2

我曾经遇到过类似的问题。我通过在执行unquote之前添加编码来解决它:

key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode("utf8"))

我尝试过类似的事情,但也许我是在取消引用后再使用encode而不是之前。我会尝试一下,谢谢! - Oded Niv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接