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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:10:27