通过 inertiajs form.post 上传的图像在 Laravel 8 中未通过 mime 图像验证

Image uploaded through inertiajs form.post fails mime image validation in Laravel 8

Laravel版本:8.82.0

我正在通过使用 form.post 方法发出 post 请求来使用 inertiajs 上传图像。控制器接收到图像数据,如下图所示:

我的简化控制器:

public function store(){
    
    Request()->validate([
        'thumbnail' => 'required|mimes:png,jpeg,jpg|max:2048'

        // Also tried, still fails.
        // 'thumbnail' => 'required|image|mimes:png,jpeg,jpg|max:2048'

    ]);
    
    return Redirect::route('showcases.index');

}

到达header后content-type为application/json,我尝试将其更改为multipart/form-data但无济于事,图像验证仍然失败。

我得到的错误是:The thumbnail must be a file of type: png, jpeg, jpg

您正在尝试验证 base64 字符串而不是文件。 在字符串格式中 laravel 验证无法验证 MIME 类型。 所以你可以尝试扩展验证规则并尝试更好的方法。 在 AppServiceProvider 中放置自定义验证(还有许多其他更简洁的方法)

public function boot()
{
    Validator::extend('image64', function ($attribute, $value, $parameters, $validator) {
        $type = explode('/', explode(':', substr($value, 0, strpos($value, ';')))[1])[1];
        if (in_array($type, $parameters)) {
            return true;
        }
        return false;
    });

    Validator::replacer('image64', function($message, $attribute, $rule, $parameters) {
        return str_replace(':values',join(",",$parameters),$message);
    });
}

现在你可以做 :

'thumbnail' => 'required|image64:jpeg,jpg,png'