2010-12-09 81 views
4

我在GAE blobstore這裏有一些文件名編碼問題。GAE blobstore文件名UTF-8編碼問題

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 2 B ?54Wn54mH5pel5pyfIDIwMTAtMDgtMDM =?=」 或=?中文2 B 4 v8O59afWt9MgMjAxMC0xMi0wMiA =?=

alt text

我懷疑最好的解決辦法可能是, 停止使用中國字符的文件名...

所有的建議都非常歡迎:)

回答

2

這是一個懸而未決的問題:Blob存儲處理器打破數據編碼,檢查here

+1

感謝您的回覆= D – KTU 2010-12-09 23:19:42

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 
+0

此代碼無效。得到一個「AttributeError:'FileInfo'對象沒有屬性'_BlobInfo__entity'」錯誤 – 2015-10-22 11:21:01

0

這是一個好辦法來的Endo-H孝直的解決方案,它可以在每個調用文檔信息對象:

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