在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
相关产品推荐
相关产品推荐

