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

在Flask中实现图片转CSV后的前端下载功能方案问询

实现Python Web应用中CSV文件的前端下载功能

你的场景是用户上传图片后生成CSV,需要把CSV文件暴露给前端下载,核心是让app.py获取生成的CSV文件信息,并提供下载接口,以下是具体实现步骤:

1. 统一CSV输出目录,让app.py能获取文件

首先在app.py里定义固定的CSV输出目录,确保权限正确且路径可被访问:

# app.py
import os
from flask import Flask, session, redirect, url_for, render_template, subprocess

app = Flask(__name__)
app.secret_key = 'your_secret_key_here'

# 定义CSV输出目录,建议放在项目根目录下的output_csvs文件夹
CSV_OUTPUT_DIR = os.path.join(os.path.dirname(__file__), 'output_csvs')
os.makedirs(CSV_OUTPUT_DIR, exist_ok=True)  # 确保目录存在

修改inference.py,让它接收app.py传递的输出目录参数,避免硬编码路径:

# inference.py
from utils import *
import sys

def main(output_dir):
    # 这里确保cfg、outputs、im_bgr_list、im_names是已处理好的输入数据
    processInputs(cfg, outputs, im_bgr_list, output_dir, im_names)

if __name__ == "__main__":
    # 从命令行接收app.py传递的输出目录
    output_dir = sys.argv[1]
    main(output_dir)

更新app.py的/view_process路由,执行完推理后获取所有CSV文件,传递给前端模板:

# app.py的process_files路由
@app.route('/view_process', endpoint='view_process')
def process_files():
    if not session.get('logged_in'):
        return redirect(url_for('login_user'))
    
    # 调用inference.py并传递输出目录
    subprocess.run(['python', 'inference.py', CSV_OUTPUT_DIR], check=True)

    # 筛选目录下所有CSV文件
    csv_files = [f for f in os.listdir(CSV_OUTPUT_DIR) if f.lower().endswith('.csv')]
    
    return render_template('view_process.html', message='文件处理完成', csv_files=csv_files)

2. 添加CSV下载路由

在app.py里新增专门的下载路由,做安全校验防止非法访问:

# app.py
from flask import send_from_directory, abort

@app.route('/download_csv/<filename>')
def download_csv(filename):
    if not session.get('logged_in'):
        return redirect(url_for('login_user'))
    
    # 安全检查:仅允许下载CSV文件,防止路径遍历攻击
    if not filename.lower().endswith('.csv'):
        abort(400, description='仅支持下载CSV文件')
    
    file_path = os.path.join(CSV_OUTPUT_DIR, filename)
    if not os.path.exists(file_path):
        abort(404, description='文件不存在')
    
    # 发送文件并设置为附件下载
    return send_from_directory(CSV_OUTPUT_DIR, filename, as_attachment=True)

3. 前端模板添加下载入口

修改view_process.html,遍历传递过来的CSV文件列表,生成下载链接:

<!-- view_process.html -->
<!DOCTYPE html>
<html>
<head>
    <title>处理结果</title>
</head>
<body>
    <h3>{{ message }}</h3>
    {% if csv_files %}
        <h4>生成的CSV文件:</h4>
        <ul>
            {% for file in csv_files %}
                <li><a href="{{ url_for('download_csv', filename=file) }}">下载 {{ file }}</a></li>
            {% endfor %}
        </ul>
    {% else %}
        <p>暂无生成的CSV文件</p>
    {% endif %}
</body>
</html>

4. 修复utils.py的路径拼接问题

用os.path.join替代硬编码路径拼接,适配不同操作系统:

# utils.py
import os
import pandas as pd
import glob

def processInputs(cfg, outputs, im_bgr_list, output_directory, im_names):
    # 补充循环逻辑,处理每个图片
    for i in range(len(outputs)):
        getSegmentationCsv(outputs[i], im_bgr_list[i], im_names[i], output_directory)

def getSegmentationCsv(output, im_bgr, im_name, output_dir):
    # 假设df1、df2是已处理好的DataFrame
    df = pd.concat([df1, df2], axis=1)
    
    # 安全拼接文件路径
    filename = os.path.join(output_dir, f"{im_name.split('.')[0]}.csv")

    # 检查文件是否存在,避免重复生成
    if not glob.glob(filename):
        df.to_csv(filename, index=False)

内容的提问来源于stack exchange,提问作者chad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:37:20