Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何压缩整个文件夹(包含子文件夹)并通过Flask提供,而不将任何内容保存到磁盘_Python_Python 3.x_Flask_Zip - Fatal编程技术网

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

Python 如何压缩整个文件夹(包含子文件夹)并通过Flask提供,而不将任何内容保存到磁盘,python,python-3.x,flask,zip,Python,Python 3.x,Flask,Zip,我在我的web服务器上有一个文件夹结构,我想通过Flask作为压缩存档 通过烧瓶提供文件非常简单,通过烧瓶发送文件: return send_file(my_file, attachment_filename=fileName, as_attachment=True) 压缩可以通过多种方式完成,比如使用shutil.make_archive或zipfile,但我不知道如何在内存中压缩整个目录,然后在不将任何内容

我在我的web服务器上有一个文件夹结构,我想通过Flask作为压缩存档

通过烧瓶提供文件非常简单,通过烧瓶发送文件:

return send_file(my_file,
                     attachment_filename=fileName,
                     as_attachment=True)
压缩可以通过多种方式完成,比如使用
shutil.make_archive
zipfile
,但我不知道如何在内存中压缩整个目录,然后在不将任何内容保存到磁盘的情况下将其发送
shutil.make_archive
似乎只能在磁盘上创建存档。互联网上的
zipfile
上的示例主要是关于单个文件的服务


我如何在一个方法中将其结合在一起,而不必将所有内容保存到磁盘?最好使用
BytesIO

回答自己的问题。如果您有任何关于如何改进此问题的反馈,我们将不胜感激。我花了很长时间才弄明白这一点,三票赞成,这似乎是一个必要的问题。
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)