如何在Flask/Python中实现上传ZIP文件的解压与内容保存
Flask实现ZIP文件上传、解压及特定文件搜索
当然可以实现,以下是针对你需求的具体实现方案,直接基于你已有的上传表单扩展即可:
1. 基础配置与依赖导入
先导入必要模块,同时配置服务器上的文件存储路径:
from flask import Flask, request, redirect, url_for, flash import os import zipfile from glob import glob app = Flask(__name__) # 配置上传的ZIP文件存储目录 UPLOAD_FOLDER = './ZIP' # 配置解压后的文件存储目录 UNZIP_FOLDER = './unzipped_files' # 确保目录存在,不存在则自动创建 os.makedirs(UPLOAD_FOLDER, exist_ok=True) os.makedirs(UNZIP_FOLDER, exist_ok=True) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # 设置密钥用于提示消息(可选,用于反馈用户操作结果) app.secret_key = 'your_custom_secret_key'
2. 处理上传、解压与搜索的核心视图函数
假设你的上传表单中文件输入框的name属性为zip_file,对应的视图函数可以这样写:
@app.route('/upload', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': # 检查请求中是否包含文件 if 'zip_file' not in request.files: flash('未选择任何文件') return redirect(request.url) file = request.files['zip_file'] # 检查文件名是否为空 if file.filename == '': flash('未选择文件') return redirect(request.url) # 验证文件是否为ZIP格式 if file and file.filename.endswith('.zip'): # 构造保存路径,可添加时间戳避免同名文件覆盖 filename = file.filename file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) # 将上传文件保存到服务器指定目录 file.save(file_path) # 执行解压操作 try: with zipfile.ZipFile(file_path, 'r') as zip_ref: # 解压到指定目录,如需覆盖已存在文件可保留默认参数 zip_ref.extractall(UNZIP_FOLDER) flash('文件上传并解压成功') except zipfile.BadZipFile: flash('上传的文件不是有效的ZIP压缩包') return redirect(request.url) # 搜索特定文件,示例为查找所有名为target.txt的文件 target_files = glob(os.path.join(UNZIP_FOLDER, '**', 'target.txt'), recursive=True) if target_files: flash(f'找到目标文件:{len(target_files)}个') # 此处可添加对目标文件的后续操作,比如读取内容、复制到指定位置等 for tf in target_files: print(f'定位到文件:{tf}') else: flash('未找到指定的目标文件') return redirect(url_for('upload_file')) else: flash('请上传ZIP格式的文件') return redirect(request.url) # GET请求时返回你的上传表单页面(如果已有单独页面可替换为对应模板渲染) return ''' <!doctype html> <title>上传ZIP文件</title> <h1>上传ZIP文件</h1> <form method=post enctype=multipart/form-data> <input type=file name=zip_file accept=".zip"> <input type=submit value=上传> </form> '''
3. 关键细节提示
- 目录权限:确保Flask运行进程对
UPLOAD_FOLDER和UNZIP_FOLDER拥有读写权限,避免出现权限报错。 - 文件去重:如果担心同名文件覆盖,可以给文件名添加时间戳或随机字符串,示例:
from datetime import datetime filename = f"{datetime.now().strftime('%Y%m%d%H%M%S')}_{file.filename}" - 安全防护:若上传文件来自不可信来源,建议添加额外校验(比如限制解压后的总文件大小、过滤带有路径遍历的恶意文件),防止服务器被攻击。
- 搜索扩展:
glob的递归搜索支持灵活匹配规则,你可以根据需求修改,比如匹配特定后缀(*.log)或包含关键词的文件名(*report*)。
内容的提问来源于stack exchange,提问作者Khizar Sayed
相关产品推荐
相关产品推荐

