0

好的,我有:

class Content(db.Model):
    code=db.TextProperty()

并且在数据库中存储了 3 个不同的代码值。我将如何创建一个 zip 文件,将代码的三个值存储在将下载的 3 个单独文件中?

基于 eric.f 的回答:我重写了他的代码,以使其达到我想要的效果:

    contents = db.GqlQuery("SELECT * FROM Content ORDER BY created DESC")
    output = StringIO.StringIO()
    with zipfile.ZipFile(output, 'w') as myzip:
        for content in contents:
            if content.code:
                code=content.code
            else:
                code=content.code2
            myzip.writestr('udacity_code'+`content.key().id()`, code)
    self.response.headers["Content-Type"] = "application/zip"
    self.response.headers['Content-Disposition'] = "attachment; filename=test.zip"
    self.response.out.write(output.getvalue())

虽然我有一个错误......

self.response.out.write(output.getvalue(), "utf-8")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/StringIO.py", line 270, in getvalue
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb4 in position 10: ordinal not in range(128)
4

1 回答 1

1
import zipfile
import StringIO

output = StringIO.StringIO()

with zipfile.ZipFile(output, 'w') as myzip:
    myzip.writestr('file1.txt', 'aaaaaaaaa')
    myzip.writestr('file2.txt', 'bbbbbbbbb')
    myzip.writestr('file3.txt', 'ccccccccc')

然后做出响应,设置output.getvalue()为内容,并设置标题如下:

Content-type: application/zip
Content-disposition: attachment; filename=test.zip
于 2012-07-23T03:14:33.667 回答