Flask无法接收文件与表单数据问题求助
问题原因与解决方案
核心问题出在手动设置multipart/form-data请求头:当使用FormData发送请求时,浏览器会自动生成包含boundary(分隔符)的Content-Type头,比如multipart/form-data; boundary=----WebKitFormBoundaryXxXxX。手动设置不带boundary的头会导致Flask无法正确解析表单数据,所以request.form为空,访问request.form['text_unput']会触发400错误。
修复步骤
1. 修正JavaScript代码
移除手动设置的Content-Type头,让浏览器自动处理:
var formData = new FormData(); formData.append("file", file); // 如果data是JSON对象,先转成字符串再传入 formData.append("text_unput", typeof data === 'object' ? JSON.stringify(data) : data); const xhr = new XMLHttpRequest(); xhr.open("POST", "https://route/to/server/paid"); // 移除这一行:xhr.setRequestHeader('Content-Type', 'multipart/form-data'); xhr.send(formData);
2. 修正Flask代码
使用request.form.get()安全获取文本字段(避免KeyError),用request.files.get()获取上传的文件;如果text_unput是JSON字符串,需先解析为对象:
import json from flask import Flask, request @app.route("/paid", methods=["POST"]) def paid(): # 安全获取文本字段,不存在时返回None text_input = request.form.get('text_unput') if not text_input: return "缺少text_unput字段", 400 # 解析JSON格式的文本字段 try: text_data = json.loads(text_input) except json.JSONDecodeError: return "text_unput不是有效JSON格式", 400 # 获取上传文件并处理 uploaded_file = request.files.get('file') if uploaded_file: # 示例:保存文件到服务器 uploaded_file.save(f"./uploads/{uploaded_file.filename}") # 返回处理结果 return json.dumps({"status": "success", "received_data": text_data}), 200
补充说明
- 若前端传入的
data是JSON对象,必须用JSON.stringify(data)转成字符串后再append到FormData,否则后端会拿到[object Object]这类无效值。 - Flask已封装
request.form(普通表单字段)和request.files(文件字段)专门解析multipart/form-data请求,无需直接处理request.data原始字节流。
内容的提问来源于stack exchange,提问作者mopishlynx23
相关产品推荐
相关产品推荐

