0

0

Flask 文件上传与表单数据解析失败的常见原因及解决方案

碧海醫心

碧海醫心

发布时间:2026-02-25 09:46:13

|

144人浏览过

|

来源于php中文网

原创

Flask 文件上传与表单数据解析失败的常见原因及解决方案

在使用 requests 向 Flask 服务发送 multipart/form-data 请求时,若手动设置 'Content-Type': 'multipart/form-data' 头,会导致 Flask 无法正确解析 request.form 和 request.files,所有数据被错误归入 request.data。根本原因是缺失 boundary 信息。

在使用 requests 向 flask 服务发送 multipart/form-data 请求时,若手动设置 `'content-type': 'multipart/form-data'` 头,会导致 flask 无法正确解析 `request.form` 和 `request.files`,所有数据被错误归入 `request.data`。根本原因是缺失 boundary 信息。

当你通过 Python 脚本调用 Flask 接口上传文件并提交表单字段(如 data_type、sample_rate)时,必须确保 HTTP 请求符合 multipart/form-data 的规范。该格式要求请求头中包含形如 multipart/form-data; boundary=----WebKitFormBoundaryxxx 的完整 Content-Type 字段,其中 boundary 是用于分隔各字段的唯一分界符。Flask(基于 Werkzeug)严格依赖此 boundary 解析请求体;若 boundary 缺失或不匹配,它将无法识别字段边界,从而跳过 form 和 files 的自动解析,仅将原始字节流存入 request.data。

问题根源在于手动覆盖了 requests 自动生成的 Content-Type 头。requests 库在检测到 files 参数时,会自动:

  • 生成随机且唯一的 boundary;
  • 构造完整的 Content-Type: multipart/form-data; boundary=... 头;
  • 按照该 boundary 格式序列化 data 和 files 到请求体。

而一旦你显式传入 headers={'Content-Type': 'multipart/form-data'},就覆盖了 requests 原生生成的带 boundary 的头,导致服务器端失去解析依据。

正确做法:完全移除手动 headers

PatentPal专利申请写作
PatentPal专利申请写作

AI软件来为专利申请自动生成内容

下载
import requests

files = {
    'file': open("path/to/your/file.bin", 'rb'),
}

data = {
    'data_type': 'XYZ',
    'sample_rate': '64',
}

# ✅ 正确:不传 headers,让 requests 自动处理
response = requests.post(
    'http://127.0.0.1:8444/calculate',
    files=files,
    data=data
)

⚠️ 错误示例(引发解析失败)

# ❌ 错误:手动指定不带 boundary 的 Content-Type
headers = {'Content-Type': 'multipart/form-data'}
response = requests.post(url, headers=headers, files=files, data=data)  # → request.form 为空!

? 验证技巧:检查 Flask 端请求对象
在 Flask 路由中添加调试日志,确认解析状态:

@app.route("/calculate", methods=['POST', 'OPTIONS'])
def calculate():
    print("Headers:", dict(request.headers))
    print("Form keys:", list(request.form.keys()))           # 应输出 ['data_type', 'sample_rate']
    print("Files keys:", list(request.files.keys()))         # 应输出 ['file']
    print("Raw data length:", len(request.data))             # 若非零且 form/files 为空,说明解析失败

    process_data = request.form
    uploaded_file = request.files.get('file')
    data_type = process_data.get("data_type")
    sample_rate = int(process_data.get("sample_rate"))  # 注意:直接从 form 取值,无需额外 get()

    # ... 后续逻辑

? 补充注意事项

  • 文件句柄需确保可读且未关闭;建议使用 with open(...) 或在 requests.post() 后及时 close();
  • 若需自定义其他 header(如认证 token),可安全添加,但切勿覆盖 Content-Type
  • Postman/curl 默认正确生成 boundary,因此测试通过,这正反向印证了问题出在客户端 header 控制上;
  • 对于大文件,考虑添加超时和流式上传支持(stream=True + 分块读取),但本例中非必需。

总结:信任 requests 的 multipart 自动化能力,避免手动干预 Content-Type 头——这是保障 Flask 正确解析表单与文件的黄金准则。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

97

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

76

2025.12.15

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

452

2023.10.13

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

452

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

182

2023.10.30

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6437

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

838

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1087

2023.12.21

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

18

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号