在tornado.web中提供zip文件

时间:2013-12-05 10:04:01

标签: python zip download tornado

我是龙卷风的新手,我需要提供一个zip文件(由python制作)。

所以我将这些代码行添加到我的脚本中,找到here

        zipname="clients_counter.zip"
        zf = zipfile.ZipFile(zipname, "w")
        for dirname, subdirs, files in os.walk("tozip"):
            zf.write(dirname)
            for filename in files:
                zf.write(os.path.join(dirname, filename))
        zf.close()
        self.set_header('Content-Type', 'application/zip')
        self.write(zipname.getvalue())
        self.finish()

这只是给了我一个白页,它没有开始下载。有没有人有更好的建议来实现我的目标?

2 个答案:

答案 0 :(得分:2)

如果您想将zipfile动态发送到浏览器(不保存到本地文件系统),请尝试以下操作:

from io import BytesIO
zipname="clients_counter.zip"
f=BytesIO()
zf = zipfile.ZipFile(f, "w")
    for dirname, subdirs, files in os.walk("tozip"):
        zf.write(dirname)
        for filename in files:
            zf.write(os.path.join(dirname, filename))
zf.close()
self.set_header('Content-Type', 'application/zip')
self.set_header("Content-Disposition", "attachment; filename=%s" % zipname)
self.write(f.getvalue())
f.close()
self.finish()

BytesIO对象是zipfile所在的位置,zipname只是发送到客户端浏览器的名称。

答案 1 :(得分:0)

我已经阅读了一下这就是我发现的:我为龙卷风构建了静态目录,我已经更改了python代码以将zip文件存储在静态文件夹中:

zipname="C:/whatever/static/clients_counter.zip"
        zf = zipfile.ZipFile(zipname, "w")
        for dirname, subdirs, files in os.walk("tozip"):
            zf.write(dirname)
            for filename in files:
                zf.write(os.path.join(dirname, filename))
        zf.close()
        self.write("""<a href="/static/clients_counter.zip"> Download Zip of client counter files</a>""")
    except:
        traceback.print_exc()

settings = {
"static_path" : os.path.join(os.path.dirname(__file__), "static")
}  # This indicates the directory for static files to the server: 
   # it has to be a directory called static inside the project directory

比构建新目录或使用其他更困难的黑客攻击容易得多。如果这可以帮助任何人,我很高兴。