php – 在laravel中验证base64解码图像

前端之家收集整理的这篇文章主要介绍了php – 在laravel中验证base64解码图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从PUT请求获取图像以更新用户图片(使用邮递员),并使其通过Laravel 5.2中的验证,以便在邮递员中使用以下URL进行调用

http://localhost:8000/api/v1/users?_method=PUT

并使用像这样的json在体内发送图像字符串:

{
    "picture" : "data:image/png;base64,this-is-the-base64-encode-string"
}

在控制器中尝试许多不同的方法来解码图像并尝试通过验证:

>首先我试过这个:

$data = request->input('picture');
$data = str_replace('data:image/png;base64,','',$data);
$data = str_replace(' ','+',$data);
$image = base64_decode($data);
$file = app_path() . uniqid() . '.png';
$success = file_put_contents($file,$image);

>然后我尝试了这个:

list($type,$data) = explode(';',$data);
list(,$data) = explode(',$data);
$data = base64_decode($data);
$typeFile = explode(':',$type);
$extension = explode('/',$typeFile[1]);
$ext = $extension[1];
Storage::put(public_path() . '/prueba.' . $ext,$data);
$contents = Storage::get(base_path() . '/public/prueba.png');

>尝试使用干预图像库(http://image.intervention.io/)并且不通过:

$image = Image::make($data);
$image->save(app_path() . 'test2.png');
$image = Image::make(app_path() . 'test1.png');

这是控制器中的验证:

$data = [
        'picture' => $image,'first_name' => $request->input('first_name'),'last_name' => $request->input('last_name')
    ];

    $validator = Validator::make($data,User::rulesForUpdate());
    if ($validator->fails()) {
        return $this->respondFailedParametersValidation('Parameters Failed validation for a user picture');
    }

这是用户模型中的验证:

public static function rulesForUpdate() {
    return [
        'first_name' => 'max:255','last_name' => 'max:255','picture' => 'image|max:5000|mimes:jpeg,png'
    ];
}

解决方法

您可以扩展Laravel的Validator类.

Laravel Doc

但无论如何试试这个

Validator::extend('is_png',function($attribute,$value,$params,$validator) {
    $image = base64_decode($value);
    $f = finfo_open();
    $result = finfo_buffer($f,$image,FILEINFO_MIME_TYPE);
    return $result == 'image/png';
});

不要忘记规则:

$rules = array(
   'image' => 'is_png'
);

猜你在找的Laravel相关文章