Храните вложенные данные в файлах с помощью vuejs & laravel - PullRequest
0 голосов
/ 15 октября 2018

У меня есть форма, которая содержит информацию о нескольких лицах: гражданин, паспорт, сканирование паспорта.

Мне нужно спасти гражданина с его отношениями, и в то же время загрузить отсканированные паспорта, которые являются изображениями.

В итоге у меня был объект на стороне клиента, который выглядит следующим образом:

enter image description here

Однако я не знаю, как хранить сканы, так как я ничего не смог получить из метода $request->file(...) laravel (он возвращает ноль).

В моем случае все эти объекты должны быть единообразными, я имею в виду, что не должно быть никаких случаев, когда я храню гражданина без паспорта или паспорта без сканирования.

Итак, я 'я не уверен, как хранить сканы в этом случае, так как я не могу использовать вложенные данные в объектах formData, например.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Я столкнулся с той же самой проблемой только вчера, и, наконец, у меня есть решение.Вот что это:

В документации Laravel не сказано, или, по крайней мере, я не смог ее найти, но вы также можете получить доступ к загруженному файлу, как и к любому другому полю, например: $ request-> uploadedFile, и использовать его длясохраните это так

Storage::putFile('public', $request->uploadedFile);

Так что в вашем примере вы можете хранить сканы так:

Storage::putFile('public', $request->foreignCitizen['passports'][0]['scans'][0]);

В общем, вы наверняка знаете, как применить некоторые циклы for, чтобы сделать этоболее управляемым.

PS: Вы не упоминаете, если вы уже разобрались в части отправки объекта с вложенными файлами в laravel, но, как я уже сказал, у меня точно такая же проблема (vuejs /я могу помочь с этим тоже.

0 голосов
/ 15 октября 2018

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 и сохранив ее в виде файла.

Если вы решили разделить процесс, сначала сохраните человека, а затем изображение.Это, вероятно, немного проще для реализации и меньше кода на серверной части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...