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

React函数式组件用Fetch传文件到Flask,后端无法获取怎么办?

解决React文件上传至Flask服务器无法接收的问题

问题核心在于React端没有以正确的格式传递文件数据,导致Flask无法识别。以下是具体修改方案:

React组件修改

原代码中直接传递ev.target.inputFile.value仅能获取文件名,而非实际文件对象,且未使用文件上传标准的FormData格式。修改后的代码如下:

export function UploadComponent() {
  const onSubmit = async (ev) => {
    ev.preventDefault();
    // 获取选中的文件对象
    const file = ev.target.inputFile.files[0];
    if (!file) {
      console.log("请先选择文件");
      return;
    }

    // 用FormData封装文件,这是浏览器处理文件上传的标准方式
    const formData = new FormData();
    formData.append('inputFile', file);

    const response = await fetch("/api/upload", {
      method: 'POST',
      body: formData // fetch会自动为FormData设置正确的Content-Type请求头
    });

    if (response.ok) {
      const resData = await response.json();
      console.log("文件上传成功:", resData.message);
    } else {
      console.log("文件上传失败");
    }
  };

  return (
    <form onSubmit={onSubmit}>
      <input id="inputFile" type="file" />
      <button type="submit">Submit</button>
    </form>
  );
}

Flask路由优化

原代码逻辑基本可行,但可以增加错误判断,让代码更健壮:

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/upload', methods=['POST'])
def upload():
    # 检查请求中是否包含文件
    if 'inputFile' not in request.files:
        return jsonify({"message": "未接收到文件"}), 400
    
    file = request.files['inputFile']
    # 检查是否选中了有效文件
    if file.filename == '':
        return jsonify({"message": "未选择文件"}), 400
    
    # 此处添加文件处理逻辑,例如保存到服务器
    # file.save(f"./uploads/{file.filename}")
    
    return jsonify({"message": "文件接收成功"})

if __name__ == '__main__':
    app.run(debug=True)

关键说明

  • 必须使用FormData封装文件:这是浏览器支持的文件上传标准格式,会自动生成multipart/form-data类型的请求头,Flask的request.files仅能识别该格式的文件数据。
  • 正确获取文件对象:通过input.files[0]获取用户选中的文件,而非input.value(后者仅返回文件名)。
  • Flask端增加前置校验:避免因无文件或空文件导致的异常。

内容的提问来源于stack exchange,提问作者Pink Flying Elephant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:40:19