WP REST API中无法获取avatar字段进行前置文件验证的问题求助
问题描述
实现用户头像上传功能,需对用户上传的文件进行格式与大小验证。已编写如下REST路由代码,但无法在args中获取avatar字段,其validate_callback方法未被调用:
register_rest_route( self::NAMESPACE, '/user', [ [ 'methods' => WP_REST_Server::EDITABLE, 'callback' => [User::class, 'update'], 'permission_callback' => '__return_true', 'args' => [ 'avatar' => [ 'description' => __( 'User avatar' ), 'required' => false, 'validate_callback' => function($param, $request, $key) { // 此方法未被调用 return true; }, ], ], ], ] );
目前能在User类的update方法中通过get_file_params()接收文件,但希望在进入该方法前完成文件验证:
public static function update(WP_REST_Request $request) { return $request->get_file_params(); }
解决方案
WordPress REST API对文件上传参数的处理逻辑和普通POST参数不同,默认不会将文件参数纳入args的常规验证流程,需要做以下调整:
1. 开启路由的文件上传支持
在路由配置中添加'file_uploads' => true,明确告知该路由接受文件上传:
register_rest_route( self::NAMESPACE, '/user', [ [ 'methods' => WP_REST_Server::EDITABLE, 'callback' => [User::class, 'update'], 'permission_callback' => '__return_true', 'file_uploads' => true, // 开启文件上传支持 'args' => [ 'avatar' => [ 'description' => __( 'User avatar' ), 'required' => false, 'validate_callback' => function($param, $request, $key) { // 从请求中获取文件参数 $files = $request->get_file_params(); if (empty($files[$key])) { return true; // 非必填,无文件时直接通过 } $avatar = $files[$key]; // 验证文件类型 $allowed_types = ['image/jpeg', 'image/png', 'image/gif']; if (!in_array($avatar['type'], $allowed_types)) { return new WP_Error( 'invalid_file_type', __('只允许上传JPG、PNG、GIF格式的图片'), ['status' => 400] ); } // 验证文件大小(示例:限制2MB以内) $max_size = 2 * 1024 * 1024; if ($avatar['size'] > $max_size) { return new WP_Error( 'file_too_large', __('图片大小不能超过2MB'), ['status' => 400] ); } return true; }, ], ], ], ] );
2. 确保请求使用正确的Content-Type
客户端发送请求时,必须设置Content-Type: multipart/form-data,否则WordPress无法正确解析文件参数。
3. 验证逻辑说明
- 文件参数不会传入
$param变量,需通过$request->get_file_params()获取上传的文件数组。 - 验证不通过时返回
WP_Error对象,REST API会自动返回对应错误响应,不会进入后续的callback方法。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

