如何在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')
答
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)
以将文件对象的读写位置“倒带”回到起始位置。
**另请参阅:** https://*.com/questions/26513542/flask-how-to-send-a-dynamically-generate-zipfile-to-the-client – dreftymac 2017-12-11 22:57:18