【问题标题】:How to send zip files in the python Flask framework?如何在 python Flask 框架中发送 zip 文件?
【发布时间】:2015-02-04 20:52:54
【问题描述】:

我有一个烧瓶服务器,它从数据库中获取几个不同文件的二进制数据,并将它们放入 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')

【问题讨论】:

标签: python http flask zipfile


【解决方案1】:

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) 调用才能将文件对象的读写位置“倒回”到开始位置。

【讨论】:

  • 当我只有files = ['filename1', 'filename2'] 即服务器站点上我想压缩和发送的文件时,我该怎么做?
  • @Cleb:您的意思是您的字符串中有完整的文件名,并且这些文件存在于磁盘上?然后使用zf.write() method 将这些文件中的数据添加到ZipFile 对象中。
  • 谢谢,这确实是我最终的结果(也使用this answer 只获取文件并避免整个目录结构)。
  • @MartijnPieters 我尝试了您的代码并生成了一个存档,但似乎无效。 7zip 例如,告诉我该文件不能作为存档打开。你对此有什么想法吗?
  • @AlexandreD.: 对不起,我不知道你如何处理你的二进制数据;这个答案专门处理将 zipfile 对象保存在内存中,而不是磁盘上。
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多