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

idu*_*osn 22 python http zipfile 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')
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 36

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

您可以ZipFile()使用以下BytesIO() 为基础创建内存:

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)
Run Code Online (Sandbox Code Playgroud)

with语句确保在ZipFile()完成添加条目后正确关闭对象,从而使其将所需的尾部写入内存中的文件对象.该memory_file.seek(0)电话是需要"倒带"回到开始的文件对象的读写位置.

  • @Cleb:您的意思是您拥有完整的字符串文件名,并且这些文件存在于磁盘上?然后使用[`zf.write()`方法](https://docs.python.org/3/library/zipfile.html#zipfile.ZipFile.write)将这些文件中的数据添加到`ZipFile`中宾语。 (2认同)