You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:24:24