GAE blobstore 文件名 UTF-8 编码问题
我在GAE的blobstore中遇到了一些文件名编码的问题。
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads('file')
blob_info = upload_files[0]
#Problem right here
decoded_filename = blob_info.filename.decode("utf-8")
#
File_info = Fileinfo(
key_name=str(blob_info.key()),
filename=decoded_filename,
)
File_info.put()
self.redirect("/")
在本地运行时,它在SDK控制台中正常工作,

但是上传到GAE后,存储的文件名显示成了无法解码的字符串,像这样:
"=?UTF-8?B?54Wn54mH5pel5pyfIDIwMTAtMDgtMDM=?="或者是这样的:
"=?Big5?B?v8O59afWt9MgMjAxMC0xMi0wMiA=?="我怀疑最好的解决办法可能是,
停止使用中文字符作为文件名……
欢迎大家提出建议 :)
3 个回答
0
这里有一个对ENDOHTakanao解决方案的小调整,你可以在每个file_info对象上调用它:
def get_filename_from_file_info(file_info):
filename_mime = file_info.filename
if isinstance(filename_mime, unicode):
filename_mime_utf8 = filename_mime.encode('utf-8')
else:
filename_mime_utf8 = filename_mime
filename_encoded, encoding = email.header.decode_header(filename_mime_utf8)[0]
if encoding is not None:
filename_unicode = filename_encoded.decode(encoding)
filename_utf8 = filename_unicode.encode('utf-8')
return filename_utf8
return filename_mime_utf8
0
BlobInfo的文件名是由谷歌进行MIME编码的。
我不知道谷歌为什么要这样做。
这对生活在多字节字符国家的人来说是有问题的。
如果你使用下面的任何字符编码,就可以得到正确的文件名:
import email
for blob_info in self.get_uploads('file'):
filename_mime = blob_info.filename
if isinstance(filename_mime, unicode):
filename_mime_utf8 = filename_mime.encode('utf-8')
else:
filename_mime_utf8 = filename_mime
filename_encoded, encoding = email.header.decode_header(filename_mime_utf8)[0]
if encoding is not None:
filename_unicode = filename_encoded.decode(encoding)
filename_utf8 = filename_unicode.encode('utf-8')
blob_info._BlobInfo__entity['filename'] = filename_utf8
2
这是一个未解决的问题:Blobstore 处理程序导致数据编码出错,可以在这里查看详细信息。