从appengine数据存储区中压缩一组blob

时间:2011-06-30 16:24:32

标签: python google-app-engine zipfile

我需要在数据存储中压缩一组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()

1 个答案:

答案 0 :(得分: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()