如何转换Unicode键名以便amazon-s3识别?

2 投票
1 回答
1820 浏览
提问于 2025-04-16 15:05

在一个Django应用中,我收到了一个POST变量,这个变量是上传到亚马逊S3的文件名。

但是我收到的这个文件名是以unicode格式的,当我把这个文件名传给boto和亚马逊S3时,什么都没有返回。不过,如果我用boto列出存储桶里的文件,然后从列表中获取文件名,亚马逊S3就会返回我想要的对象。

所以我想问的是,怎么才能把我的unicode文件名转换成boto所用的编码,这样亚马逊才能给我对象。

我怎么知道boto的文件名是什么编码的呢?

非常感谢任何建议,这个问题让我很头疼。之前一切都很好,直到我们添加了一个斜杠,我看不出这会有什么不同。

这是终端中的代码:

>>> unicode_key_name
u'missionuploads/tom-mission-4d8f9da9122ac21c17000002-4_4_11_9_38_PM.jpg'
>>> boto_key_name
'missionuploads/tom-mission-4d8f9da9122ac21c17000002-4_4_11_9_37_PM.jpg'
>>> len(unicode_key_name)
70
>>> len(boto_key_name)
70
>>> unicode_key = bucket.get_key(unicode_key_name.encode('utf-8'))
>>> unicode_key
>>> unicode_key = bucket.get_key(unicode_key_name.encode('ascii'))
>>> unicode_key
>>> boto_key = bucket.get_key(boto_key_name)
>>> boto_key
<Key: user.media.eu,missionuploads/tom-mission-4d8f9da9122ac21c17000002-4_4_11_9_37_PM.jpg>

-------- 编辑 ----------

传递unicode字符串是没问题的,不需要转换,只要确保你在搜索正确的文件名就行!

因为我刚在服务器端收到了文件名,我以为它是正确的,但错误似乎出在应用端,保存时用一个名字,然后又发送了一个新创建的名字(相差一分钟)到服务器。

1 个回答

5

'37''38'是两个不同的字符串。使用正确的值时,程序应该能正常运行。

撰写回答