[英]How to send zip files in the python Flask framework?
我有一个Flask服务器,它从数据库中获取几个不同文件的二进制数据,并将它们放入python'zipfile'对象中。 我想使用flask的“ send_file”方法将生成的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)
调用来将文件对象的读写位置“倒回”到开头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.