GAE Blobstore文件名的UTF-8编码问题

4
我在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控制台中它的功能正常, alt text 但是上传到GAE后,它存储的内容显示为非解码字符串 "=?UTF-8?B?54Wn54mH5pel5pyfIDIwMTAtMDgtMDM=?=" 或 =?Big5?B?v8O59afWt9MgMjAxMC0xMi0wMiA=?= alt text 我怀疑最好的解决方案可能是, 停止使用中文字符文件名...
欢迎提出所有建议 :)
3个回答

2

这是一个未解决的问题: Blobstore处理程序破坏数据编码, 可以在这里查看。


0

这是一个针对 ENDOH takanao 解决方案的小调整,你可以在每个 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的文件名是由Google进行MIME编码的。 我不知道Google为什么这样做。

对于居住在多字节国家的人来说,这是有问题的。

如果你使用以下任何字符编码,就可以得到正确的文件名:

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

这段代码不起作用。会出现"AttributeError: 'FileInfo' object has no attribute '_BlobInfo__entity'"错误。 - Gwyn Howell

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