Zip набор капель из хранилища данных appengine - PullRequest
0 голосов
/ 30 июня 2011

Мне нужно сжать набор BLOB-объектов, доступных в хранилище данных.Это могут быть разные типы, такие как html / images / swf / и т. Д., Где все они доступны в хранилище данных как blob.

Я пытался реализовать это решение: Архивирование динамических файлов в App Engine (Python)?

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

z.writestr(fil.Template_name, my_data.encode('UTF-8'))
File "C:\Python25\lib\zipfile.py", line 626, in writestr
self.fp.write(zinfo.FileHeader())
File "C:\Python25\lib\zipfile.py", line 260, in FileHeader
return header + self.filename + extra
UnicodeDecodeError: 'ascii' codec can't decode byte 0xde in position 12: ordinal not in range(128)

Это ошибка для этой части кода

       class filesDB(db.model) 
                   Template_file = db.BlobProperty()
                   Template_name= db.StringProperty()


       output = StringIO.StringIO()
       z = zipfile.ZipFile(output,'w')
       files =  filesDB.all().filter("fCreatedBy","sandeep")
       for fil in files:
        my_data = fil.Template_file
        z.writestr(fil.Template_name, my_data)
        z.close()

1 Ответ

3 голосов
/ 01 июля 2011

В документации zipfile :

Не существует официальной кодировки имен файлов для файлов ZIP.
Если у вас есть имена файлов в кодировке Юникод, вы должны преобразовать их в байтыстроки в нужной вам кодировке перед передачей их в write ().

Попробуйте закодировать ваше имя файла в UTF-8, например, с помощью:

class filesDB(db.model) 
                   Template_file = db.BlobProperty()
                   Template_name= db.StringProperty()


       output = StringIO.StringIO()
       z = zipfile.ZipFile(output,'w')
       files =  filesDB.all().filter("fCreatedBy","sandeep")
       for fil in files:
        my_data = fil.Template_file
        z.writestr(fil.Template_name.encode('utf-8'), my_data)
        z.close()
...