python - 如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘
问题描述
我的网络服务器上有一个文件夹结构,我想通过 Flask 将其用作压缩存档。
通过 Flask send_file 通过 Flask 提供文件非常简单:
return send_file(my_file,
attachment_filename=fileName,
as_attachment=True)
压缩可以通过各种方式完成,例如使用shutil.make_archive
or 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)
推荐阅读
- excel - 在 VBA 错误消息中从 Excel 文件中读取日期
- sql - 带有记录的 SQL 查询以开头并包含以
- c# - 更新syncfusion nuget后重建项目时出错
- arrays - 以下问题中的递归如何工作?
- python - 如何获取给定时间段内列出的所有股票代码
- mysql - 选择查询输出中的常量列值
- android - SQLite 多个查询比连接更快
- python - 如何在我的多索引熊猫数据框中只选择每个级别 (0) 的前两行?
- selenium - 如何使用python在selenium的搜索框中输入数据后执行输入键操作
- c++ - QT C++ 项目(使用 XML 创建登录)