如何在python Flask框架中发送zip文件?

问题描述:

我有一个瓶颈服务器,它抓取数据库中几个不同文件的二进制数据,并将它们放入一个python'zipfile'对象中。我想使用烧瓶的“send_file”方法将生成的zip文件与我的代码一起发送。如何在python Flask框架中发送zip文件?

我最初能够通过使用BytesIO(bin)作为send_file的第一个参数成功发送非zip文件,但出于某种原因,我无法对生成的zip文件做同样的事情。它给出了错误:

'ZipFile'没有缓冲区接口。

如何使用Flask将此zip文件对象发送给用户?

这是我的代码:

@app.route("/getcaps",methods=['GET','POST']) 
def downloadFiles(): 
    if request.method == 'POST': 
     mongo = MongoDAO('localhost',27017) 
     identifier = request.form['CapsuleName'] 
     password = request.form['CapsulePassword'] 
     result = mongo.getCapsuleByIdentifier(identifier,password) 
     zf = zipfile.ZipFile('capsule.zip','w') 
     files = result['files'] 
     for individualFile in files: 
      data = zipfile.ZipInfo(individualFile['fileName']) 
      data.date_time = time.localtime(time.time())[:6] 
      data.compress_type = zipfile.ZIP_DEFLATED 
      zf.writestr(data,individualFile['fileData']) 
     return send_file(BytesIO(zf), attachment_filename='capsule.zip', as_attachment=True) 
    return render_template('download.html') 
+1

**另请参阅:** https://*.com/questions/26513542/flask-how-to-send-a-dynamically-generate-zipfile-to-the-client – dreftymac 2017-12-11 22:57:18

BytesIO()

需要传递字节的数据,但ZipFile()对象不是字节数据;你实际上在你的硬盘上创建了一个文件

您可以通过使用BytesIO()为基数在内存中创建一个ZipFile()

memory_file = BytesIO() 
with zipfile.ZipFile(memory_file, 'w') as zf: 
    files = result['files'] 
    for individualFile in files: 
     data = zipfile.ZipInfo(individualFile['fileName']) 
     data.date_time = time.localtime(time.time())[:6] 
     data.compress_type = zipfile.ZIP_DEFLATED 
     zf.writestr(data, individualFile['fileData']) 
memory_file.seek(0) 
return send_file(memory_file, attachment_filename='capsule.zip', as_attachment=True) 

with语句确保完成添加条目时ZipFile()对象正确关闭,导致它写需要预告片到内存中的文件对象。需要调用memory_file.seek(0)以将文件对象的读写位置“倒带”回到起始位置。