从App Engine 数据存储中压缩一组二进制数据

0 投票
1 回答
713 浏览
提问于 2025-04-16 20:36

我需要把一些存储在数据仓库里的文件打包成一个压缩文件。这些文件可能是不同类型的,比如一些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()

撰写回答