从App Engine 数据存储中压缩一组二进制数据
我需要把一些存储在数据仓库里的文件打包成一个压缩文件。这些文件可能是不同类型的,比如一些HTML文件、图片、SWF文件等等,所有这些都以二进制大对象(blob)的形式存储在数据仓库中。
我尝试实现这个解决方案:在App Engine中打包动态文件(Python)。
我用一些静态文本测试过,效果很好,我也能创建一个包含一组文件及其内容的压缩文件,但在从查询中创建压缩文件时遇到了一些问题,没法找到具体的原因。
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
根据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()