Проблема с кодировкой UTF-8 имени файла хранилища больших двоичных объектов GAE

У меня есть проблема с кодировкой имени файла в хранилище больших двоичных объектов GAE.

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

альтернативный текст

Я сомневаюсь, что лучшим решением может быть прекращение использования имени файла китайского символа ...

Все предложения очень приветствуются :)


person KTU    schedule 09.12.2010    source источник


Ответы (3)


Это открытая проблема: обработчик Blobstore нарушает кодировку данных, проверьте здесь.

person systempuntoout    schedule 09.12.2010

Имя файла 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
person ENDOH takanao    schedule 25.02.2015
comment
этот код не работает. получить AttributeError: объект «FileInfo» не имеет атрибута «_BlobInfo__entity» ошибка - person Gwyn Howell; 22.10.2015

Вот настройка решения 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
person Gwyn Howell    schedule 22.10.2015