首页 > 解决方案 > 如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘

问题描述

我的网络服务器上有一个文件夹结构,我想通过 Flask 将其用作压缩存档。

通过 Flask send_file 通过 Flask 提供文件非常简单:

return send_file(my_file,
                     attachment_filename=fileName,
                     as_attachment=True)

压缩可以通过各种方式完成,例如使用shutil.make_archiveor zipfile,但我不知道如何将整个目录压缩到内存中,然后在不将任何内容保存到磁盘的情况下发送它。shutil.make_archive似乎只能在磁盘上创建档案。在网上找到的例子zipfile主要是关于服务单个文件的。

我如何将它们以一种方法结合在一起,而不必将所有内容都保存到磁盘?最好使用BytesIO.

标签: pythonpython-3.xflaskzip

解决方案


import time
from io import BytesIO
import zipfile
import os
from flask import send_file


@app.route('/zipped_data')
def zipped_data():
    timestr = time.strftime("%Y%m%d-%H%M%S")
    fileName = "my_data_dump_{}.zip".format(timestr)
    memory_file = BytesIO()
    file_path = '/home/data/'
    with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zipf:
          for root, dirs, files in os.walk(file_path):
                    for file in files:
                              zipf.write(os.path.join(root, file))
    memory_file.seek(0)
    return send_file(memory_file,
                     attachment_filename=fileName,
                     as_attachment=True)

推荐阅读