首页 文章

在laravel中验证base64解码图像

提问于
浏览
2

我试图从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');
$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'
    ];
}

2 回答

  • 3

    您可以扩展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'
    );
    
  • 11

    如果您仍在使用干预,那么您可以将其用于自定义验证规则 . 我有一个叫做“可成像”的 . 它基本上确保给定的输入能够转换为干预图像 . Base64数据图像字符串将通过 . 一串“foo”不会 .

    Validator::extend('imageable', function ($attribute, $value, $params, $validator) {
        try {
            ImageManagerStatic::make($value);
            return true;
        } catch (\Exception $e) {
            return false;
        }
    });
    

    这显然只是检查输入是否能够转换为图像 . 但是,它应该向您展示如何利用干预及其任何方法来创建自定义规则作为用例 .

相关问题