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

Fon*_*a16 2 python zip flask python-3.x

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

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

return send_file(my_file,
                     attachment_filename=fileName,
                     as_attachment=True)
Run Code Online (Sandbox Code Playgroud)

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

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

Fon*_*a16 7

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