
当使用 FormData 发送请求时,若手动设置 Content-Type: application/json,Laravel 将无法解析表单数据,导致 request()->all() 返回空数组;正确做法是让客户端(如 Postman)自动设置 multipart/form-data 及其 boundary。
当使用 formdata 发送请求时,若手动设置 `content-type: application/json`,laravel 将无法解析表单数据,导致 `request()->all()` 返回空数组;正确做法是让客户端(如 postman)自动设置 `multipart/form-data` 及其 boundary。
在 Laravel 中,request()->all()、$request->input() 或 $request->file() 等方法依赖于 Laravel 对请求内容类型的自动识别与解析。当你通过 JavaScript 的 FormData 构造请求(例如 new FormData().append('firstname', 'fakeName')),浏览器会自动将请求头设为:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryabc123
该 boundary 是动态生成的分隔符,用于划分表单字段——Laravel 的底层 Symfony HttpFoundation 组件正是依据此 Content-Type 和对应边界规则,逐段解析出字段名与值。
⚠️ 关键错误:你在 Postman 中手动覆盖了 Content-Type 为 application/json。这会导致两个严重后果:
- Laravel 认为这是一个 JSON 请求,尝试调用 json_decode($content, true) 解析原始体(即 getContent() 返回的原始 multipart 字符串),自然失败;
- Request::instance()->all() 内部跳过 multipart 解析逻辑,直接返回空数组。
✅ 正确配置(Postman 操作步骤):
- 在 Body 选项卡中选择 form-data(而非 raw 或 x-www-form-urlencoded);
- 输入键值对(如 key: firstname, value: fakeName);
- 完全不要手动设置 Content-Type 头 —— Postman 会自动生成并注入正确的 multipart/form-data; boundary=...;
- 如需 Accept 头,可保留 'Accept': 'application/json',它不影响请求体解析。
? 补充验证方式(Laravel 控制器中):
public function store(Request $request)
{
\Log::info('Raw content:', ['raw' => $request->getContent()]);
\Log::info('All inputs:', ['data' => $request->all()]);
\Log::info('File fields:', ['files' => $request->files->all()]);
return response()->json([
'success' => true,
'data' => $request->only('firstname'),
'has_file' => $request->hasFile('avatar')
]);
}
? 总结:
- FormData → 必须匹配 multipart/form-data;
- 手动设置 Content-Type 会覆盖 Postman 自动行为,是常见陷阱;
- Laravel 不支持“用 application/json 包裹 multipart 数据”——二者语义与解析机制完全不兼容;
- 若需发送 JSON 数据,请改用 JSON.stringify({ firstname: 'fakeName' }) + Content-Type: application/json,并在前端避免混用 FormData。











