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

Flask中CSV文件上传至数据库问题排查:页面加载、传输及读取异常求助

你的CSV上传代码里的几个关键错误及修复方案

让我帮你排查一下代码里的问题,这些应该就是导致你无法正常加载、传输和读取CSV文件的原因:

前端表单的核心错误

  • 表单请求方法错误:你的表单用了method="get",但上传文件必须使用POST方法——GET请求不会把文件内容发送到后端,只会把表单参数拼在URL里,文件根本传不上去。
  • enctype格式错误:enctype = "multipart / form-data"里的空格是无效的,正确的写法是enctype="multipart/form-data",空格会导致浏览器无法识别正确的表单编码类型,文件数据会丢失。
  • 路由路径不匹配:表单的formaction="/insertionDBEsiti"和后端路由/inserimentoDBEsiti拼写不一致(insertion vs inserimento),这会导致请求找不到对应的处理函数,直接返回404。
  • 表单字段name与后端不匹配:比如前端学年输入框的name是"Academic Year",但后端用request.form.get('aa')获取,这根本拿不到值——后端必须对应前端的name属性值,或者你可以把前端的name改成aa(建议不要用带空格的name,容易出问题)。

后端处理代码的错误

  • 文件参数大小写不匹配:前端文件输入的name是"FileN",但后端写的是request.files["fileN"]——Python是大小写敏感的,这里应该写成request.files["FileN"],否则会抛出KeyError。
  • 不必要的GET方法支持:你的路由声明了methods=['POST', 'GET'],但GET请求不可能携带文件,建议只保留POST,避免无效请求。
  • 相对路径与文件夹存在性问题:app.config["result"] = "../temp/"用了相对路径,可能会因为应用运行目录不同导致找不到文件夹;而且如果../temp/不存在,file.save()会直接报错。应该改用绝对路径,并且提前创建文件夹:
    import os
    temp_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "temp"))
    os.makedirs(temp_dir, exist_ok=True)
    app.config["result"] = temp_dir
    
  • 缺少文件存在性检查:如果用户没选择文件就点击提交,request.files["FileN"]会是一个空的FileStorage对象,调用save()会出错。应该先判断文件是否存在:
    file = request.files.get("FileN")
    if not file or file.filename == "":
        # 处理没有上传文件的情况,比如返回警告
        return render_template("your_page.html", warning="请选择要上传的CSV文件")
    
  • 表单字段获取错误:除了学年的问题,前端Session和Test Type的name是正确的,但后端aa = request.form.get('aa')应该改成aa = request.form.get('Academic Year'),或者把前端的name改成aa更规范。

修正后的示例代码

前端表单修正:

<div class = "content"> 
 <div class = "container"> 
  <div class = "main"> 
   <h1> <strong> LOADING RESULTS </strong> </h1> 
   <br/> 
   <div class = "round"> 
    <!-- 修正method、enctype,调整name属性为无空格格式 -->
    <form name = "controlEsits" action = "/inserimentoDBEsiti" method = "post" enctype = "multipart/form-data"> 
     <fieldset> 
      <legend> UPLOAD RESULTS FROM CSV </legend> 
      <br/> 
      <strong> Academic Year </strong> 
      <!-- 把name改成aa,和后端对应 -->
      <input type = "text" id = "aa" name = "aa" value = "2020"> 
      <br/> 
      <strong> Session </strong> 
      <input type = "text" id = "session" name = "session" value = "Winter"> 
      <br/> 
      <strong> Test Type </strong> 
      <!-- 把name改成test_type,避免空格 -->
      <input type = "text" id = "test_type" name = "test_type" value = "English"> 
      <br/> 
      <strong> Results File </strong> 
      <input type = "file" id = "file" name = "FileN" accept = ".csv"> 
      <br/> 
      <br/> 
      <!-- 去掉formaction,用表单的action即可 -->
      <input class = "btn" type = "submit" value = "Upload Results from File" id = "btncheck"> 
      <br/> 
      <br/> 
      <font color = "red"> <b> {{warning}} </b> </font> 
     </fieldset> 
    </form> 
   </div> 
  </div> 
 </div> 
</div> 
{% include 'footer.html'%}

后端代码修正:

import os
from flask import Flask, request, render_template

@app.route('/inserimentoDBEsiti', methods=['POST'])
def inserimentoDBEsiti():
    # 获取表单参数,对应前端修改后的name
    aa = request.form.get('aa')
    session = request.form.get('session')
    typeP = request.form.get('test_type')
    
    # 获取上传文件,处理空文件情况
    file = request.files.get("FileN")
    if not file or file.filename == "":
        return render_template("your_upload_page.html", warning="请选择有效的CSV文件")
    
    # 配置临时文件夹,确保存在且用绝对路径
    temp_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "temp"))
    os.makedirs(temp_dir, exist_ok=True)
    
    # 保存文件
    file_path = os.path.join(temp_dir, file.filename)
    file.save(file_path)
    
    # 后续处理数据库写入逻辑...
    
    return render_template("your_upload_page.html", warning="文件上传成功,正在写入数据库...")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:54:05