PHP Klein接收React前端发送的multipart/form-data请求无数据问题
核心错误原因
- 前端fetch请求中手动设置了
multipart/form-data请求头和固定boundary值,这是导致数据无法解析的根本原因。当你使用FormData作为请求体时,浏览器会自动生成符合规范的Content-Type请求头,并且携带和请求体分隔符完全匹配的动态boundary值,手动指定的boundary和实际请求体的分隔符不匹配,会导致PHP无法正常解析multipart请求内容,因此解析后的文件、表单字段全为空,但请求的Content-Length数值正常。
修复步骤
- 前端删除fetch配置中手动设置的
Content-Type请求头,修改后的请求代码如下:
const data = new FormData(); data.append('sourceId', sourceId); data.append('customerId', customerId); // 若需要上传文件,追加文件参数即可,例:data.append('upload_file', 选中的File对象) const resp = await fetch(URL_CREATE_DOC, { method: 'POST', body: data // 不需要手动设置Content-Type头,浏览器会自动处理 });
- 后端Klein框架按参数类型选择对应获取方式:
- 普通表单字段(如示例中的
sourceId、customerId这类非文件参数),从参数集合中获取:
// 获取单个参数 var_dump($request->params('sourceId')); // 获取所有表单参数 var_dump($request->params());
- 上传的文件才使用
files()方法获取:
// 获取单个文件 var_dump($request->files('upload_file')); // 获取所有上传文件 var_dump($request->files()->all());
异常排查(如果修复后仍有问题)
- 确认PHP配置中的
post_max_size和upload_max_filesize值大于你上传的文件大小,避免文件过大被PHP直接过滤 - 确认接口路由没有配置301/302跳转规则,跳转过程中会丢失POST请求体
内容的提问来源于stack exchange,提问作者Poulpy
相关产品推荐
相关产品推荐

