You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP8无法接收JavaScript Fetch发送的POST数据,$_POST为空数组问题排查

问题根因

你的问题是前端请求头配置和实际传输的请求体格式不匹配,导致PHP8无法正确解析POST数据:

  1. 你在请求中传输的body是FormData对象,属于multipart/form-data格式,但手动强制设置了Content-type: application/json,格式完全不匹配,PHP不会按照表单规则解析请求体,因此$_POST和$_FILES都会为空。
  2. 额外设置的enctype是HTML表单标签的属性,不属于HTTP请求头的标准字段,属于冗余错误配置。
  3. 后端缺少跨域预检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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:54:03