Base64 отсутствует в файле запроса, вы должны прочитать строку и преобразовать ее обратно в изображение $request->get('foreignCitizen.passports[0].scans[0]')
.Другим вариантом является сохранение лица и его последующего при отправке файлов паспорта с помощью FormData, поэтому POST / person / 1 / scans прикрепит документы к человеку 1.
С помощью этого валидатора вы можете проверять изображения.
Validator::extend('image64',function($attribute, $base64Data, $mimeTypes, $validator) {
// strip out data uri scheme information (see RFC 2397)
if (strpos($base64Data, ';base64') !== false) {
[$_, $base64Data] = explode(';', $base64Data);
[$_, $base64Data] = explode(',', $base64Data);
}
// strict mode filters for non-base64 alphabet characters
if (base64_decode($base64Data, true) === false) {
return false;
}
// decoding and then reeconding should not change the data
if (base64_encode(base64_decode($base64Data)) !== $base64Data) {
return false;
}
$image = base64_decode($base64Data);
$file = finfo_open();
$type = finfo_buffer($file, $image, FILEINFO_MIME_TYPE);
return in_array($type, $mimeTypes);
});
Вдохновлен Spatie media lib
foreignCitizen.passports.*.scans.*.data => 'required|base64:image/jpeg'
.Теперь у нас есть действительное изображение base64, и мы можем его безопасно хранить.
Мне нравится использовать Медиатека Spatie , иметь метод addMediaFromBase64()
.Вы также можете сделать это вручную, преобразовав строку base64 и сохранив ее в виде файла.
Если вы решили разделить процесс, сначала сохраните человека, а затем изображение.Это, вероятно, немного проще для реализации и меньше кода на серверной части.