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

Posted

技术标签:

【中文标题】如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘【英文标题】:How do I zip an entire folder (with subfolders) and serve it through Flask without saving anything to disk 【发布时间】:2018-12-21 07:31:44 【问题描述】:

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

通过 Flask 发送文件非常简单:

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

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

我如何在一个方法中将它们绑定在一起,而不必将所有内容都保存到磁盘?最好使用BytesIO

【问题讨论】:

任何有关如何改进此问题的反馈将不胜感激。我很难弄清楚这一点,并且有 3 票赞成,这似乎是一个必要的问题。 【参考方案1】:
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)

【讨论】:

不鼓励回答自己的问题。见***.blog/2011/07/01/…

以上是关于如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘的主要内容,如果未能解决你的问题,请参考以下文章

解压后如何压缩整个目录并保持其结构?

如何使用 C# 压缩单个文件?

将文件压缩到内存并以字节python的形式读取整个存档

使用 Cygwin 压缩文件夹中的单个文件并压缩整个文件夹

java - 如何从不同的文件夹压缩多个文件并使用java将压缩文件存储在一个文件夹中

如何使用 PHP 压缩整个文件夹