【问题标题】:GAE blobstore filename UTF-8 encoding problemGAE blobstore 文件名 UTF-8 编码问题
【发布时间】:2011-05-23 02:58:49
【问题描述】:

我在 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=?=

我怀疑最好的解决方案可能是, 停止使用汉字文件名...

非常欢迎所有建议:)

【问题讨论】:

    标签: python google-app-engine utf-8 encode blobstore


    【解决方案1】:

    这是一个悬而未决的问题:Blobstore 处理程序破坏数据编码,请检查here

    【讨论】:

      【解决方案2】:

      BlobInfo 的文件名由 Google 进行 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
      

      【讨论】:

      • 此代码不起作用。得到一个“AttributeError:'FileInfo'对象没有属性'_BlobInfo__entity'”错误
      【解决方案3】:

      这是对 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
      

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 2010-12-11
        • 2017-07-15
        • 1970-01-01
        • 2013-11-12
        相关资源
        最近更新 更多