0

我需要压缩数据存储中可用的一组 blob。这些可以是不同类型的,例如一些 html/images/swf/ 等。所有这些都可以作为 blob 在数据存储中使用。

我试图实现这个解决方案: Zipping dynamic files in 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()
4

1 回答 1

3

根据zipfile文档:

ZIP 文件没有正式的文件名编码。
如果您有 unicode 文件名,则必须在将它们传递给 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()
于 2011-07-01T07:38:25.543 回答