一.将目录文件夹内的文件打包成zip格式下载, 不包含文件所在的文件夹
import os
from flask import Flask, send_file
import zipfile
app = Flask(__name__)
@app.route('/download')
def download():
# 指定要打包的目录
folder = 'path/to/folder'
# 创建一个空的内存文件,用于存储压缩文件
in_memory_zip = BytesIO()
# 创建一个ZipFile对象,将压缩文件写入内存文件
with zipfile.ZipFile(in_memory_zip, 'w', compression=zipfile.ZIP_DEFLATED) as zf:
# 遍历目录下的所有文件,并将文件添加到zip文件中
for root, dirs, files in os.walk(folder):
for file in files:
file_path = os.path.join(root, file)
# 将文件添加到zip文件中,并指定压缩文件中的文件名为文件相对路径
zf.write(file_path, arcname=file)
# 将内存文件指针移动到文件开头
in_memory_zip.seek(0)
# 返回压缩文件,指定文件名为download.zip
return send_file(in_memory_zip, attachment_filename='download.zip', as_attachment=True)
二.将目录文件夹内的文件打包成zip格式下载, 包含文件所在的文件夹
这里会把文件所在的文件夹也会一起压缩
from flask import Flask, request, send_file
from io import BytesIO
import zipfile
app = Flask(__name__)
@app.route('/download')
def download():
# 获取要下载的文件名列表
filenames = ["/path/files/test.png", "/root/user/name.docx"]
# 创建一个 BytesIO 对象,用于在内存中生成压缩文件
in_memory_zip = BytesIO()
# 将多个文件打包成压缩文件
with zipfile.ZipFile(in_memory_zip, 'w', compression=zipfile.ZIP_DEFLATED) as zf:
for filename in filenames:
zf.write(filename)
# 将 BytesIO 对象指针移到开头
in_memory_zip.seek(0)
# 返回压缩文件作为响应体,设置 Content-Disposition 头部以便浏览器自动下载该文件
return send_file(in_memory_zip, attachment_filename='files.zip', as_attachment=True)
if __name__ == '__main__':
app.run()