PHP8无法接收JavaScript Fetch发送的POST数据,$_POST为空数组问题排查
问题根因
你的问题是前端请求头配置和实际传输的请求体格式不匹配,导致PHP8无法正确解析POST数据:
- 你在请求中传输的body是
FormData对象,属于multipart/form-data格式,但手动强制设置了Content-type: application/json,格式完全不匹配,PHP不会按照表单规则解析请求体,因此$_POST和$_FILES都会为空。 - 额外设置的
enctype是HTML表单标签的属性,不属于HTTP请求头的标准字段,属于冗余错误配置。 - 后端缺少跨域预检OPTIONS请求的处理逻辑,可能导致跨域请求被浏览器拦截。
修正后的前端代码
fetch("http://localhost/api.audio-player/",{ method: 'POST', body: formData, // 删除手动设置的headers,浏览器会自动为FormData生成带正确boundary的multipart/form-data请求头 }).then(res=>(res.ok)?res.json():Promise.reject(res.statusText)) .then(data=>{ console.log(data); }).catch(err=>{ console.error("Error: "+err||"Desconocido"); });
修正后的后端代码
<?php header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type'); // 处理跨域预检请求,直接返回200 if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; } if($_SERVER['REQUEST_METHOD']==="POST"){ echo json_encode( array( "POST"=>$_POST, "FILES"=>$_FILES // 新增即可查看上传的文件信息 ) ); } ?>
验证说明
改完后重新测试即可正常获取POST参数,后续上传图片、音频等文件时,相关数据也可以直接从$_FILES全局变量中读取,完全兼容你的业务需求。
内容的提问来源于stack exchange,提问作者Euronymous
相关产品推荐
相关产品推荐

