WordPress自定义REST API文件上传路由无法获取group_id与上传文件问题
问题场景
我创建了一个用于处理上传文件的REST路由,代码如下:
register_rest_route( 'media-gallery-route', 'group_image', array( 'methods' => 'POST', 'callback' => array( $this, 'routeSaveGroupImage' ), ) ); public function routeSaveGroupImage( WP_REST_Request $request ){ $buff = $request->get_body(); }
接口地址为:https://www.test.com/wp-json/media-gallery-route/group_image?_wpnonce=ebb5924f80
我使用XMLHttpRequest发起POST请求提交数据,前端代码如下:
const xhr = new XMLHttpRequest(); const formData = new FormData(); formData.append('file', file); formData.append('group_id', groupID); // 其他参数省略 xhr.open('POST', url); xhr.setRequestHeader('Accept', 'application/json'); xhr.setRequestHeader('Content-Type', 'multipart/form-data'); xhr.send(formData);
出现的问题:在路由回调中可以查看$request参数的内容,调用get_body()方法也能拿到完整请求体,但一直无法获取到提交的group_id参数值和上传的文件资源。
根因说明
- 手动为
multipart/form-data类型的请求设置Content-Type头时,没有携带对应的boundary分隔符参数,导致后端无法正确拆分解析表单中的不同字段和文件内容。使用FormData传输数据时,浏览器会自动生成带正确boundary的Content-Type头,无需手动设置。 XMLHttpRequest.open方法第三个参数用于指定请求是否为异步模式,未显式声明时部分场景下会走同步请求逻辑,大体积的文件上传请求在同步模式下容易出现传输异常。
解决方案
按以下两步调整即可解决问题:
- 删除手动设置
Content-Type请求头的xhr.setRequestHeader('Content-Type', 'multipart/form-data')代码 - 调用
xhr.open时显式传入第三个参数true,指定异步请求模式,修改后为xhr.open('POST', url, true)
补充使用提示
在WordPress REST路由回调中,不需要手动解析请求体,可以直接通过框架封装的方法获取参数:
- 普通表单参数调用
$request->get_param('group_id')即可获取对应值 - 上传的文件调用
$request->get_file_params()即可获取所有文件的相关信息
内容的提问来源于stack exchange,提问作者adviner
相关产品推荐
相关产品推荐

