我试图从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类.
但无论如何试试这个
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' );