(postmanを使用して)ユーザー画像を更新するためのPUTリクエストから画像を取得し、Laravel 5.2で検証を通過させようとしています。postmanで呼び出しを行うには、次の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'
);
とにかく介入を使用している場合は、カスタム検証ルールにそれを活用できます。私は「イメージ可能」と呼ばれるものを持っています。基本的に、与えられた入力が介入画像に変換できることを確認します。 Base64データイメージ文字列が渡されます。 「foo」の文字列はそうではありません。
Validator::extend('imageable', function ($attribute, $value, $params, $validator) {
try {
ImageManagerStatic::make($value);
return true;
} catch (\Exception $e) {
return false;
}
});
これは明らかに、入力が画像に変換できることを確認するだけです。ただし、介入とそのメソッドを活用してカスタムルールを作成する方法をユースケースとして示す必要があります。
拡張関数内でこれを追加します
$res= mime_content_type($value);
if ($res == 'image/png' || $res == 'image/jpeg') {
return $res;
}