@procode
Разработчик

Как в Laravel загружать файлы через форму и хранить их в БД (сами файлы, а не имена или ссылки)?

Здравствуйте.

Заказчик хочет чтобы файлы из пользовательской формы сохранялись в базе данных (поле типа BLOB)

Как такое можно реализовать в Laravel?

Это вообще в Laravel возможно?

И да, можно ли сделать отсылку и сохранение файла одновременно с другими данными из формы? В одной форме.

А то в документации рассматривается случай отдельной загрузки файла с отдельным контроллером.

Спасибо.
  • Вопрос задан
  • 2107 просмотров
Решения вопроса 1
@procode Автор вопроса
Разработчик
Ну, вроде после проб-и-ошибок+гугл оно работает :)

Два момента:

<form class="form" enctype="multipart/form-data" action="{{ route('file.store') }}" method="POST">


без enctype файл не грузится, не забывайте, не будьте как я))

В контроллере примерно такое сейчас:

$file = $request->inputname; // inputname - это name поля из формы			
$filecontent = $file->openFile()->fread($file->getSize()); // эта магия из стэковерфлоу 
//что за openFile() - я не понимаю... 
$filename = $file->getClientOriginalName();  // getClientOriginalName() - тоже какой-то секретный
//метод))) в документации его нет)) но это работает!))


вот такой вот загадочный код )))))))))

может кому пригодится
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Вопрос: нахрена это заказчику? С каких пор заказчик решает какие архитектурные решения использует программист?

Если бы это был тимлид или другой программист, то да, можно, но нужно учесть нюансы. Например, в своем проекте я храню мелкие архивы (700 байт) в редисе, так как файлов очень много (что не есть хорошо для файловой системы), и это не хранилище, а всего-лишь кэш, причем который чистит себя сам. В таком случае - да, можно использовать БД для хранения файлов, но это одно из исключений, а не норма.

В моем случае zip архив конвертировался в string библиотекой, а раздавался так:
/**
     * Return file from string (buffer).
     *
     * @param $content
     * @param null   $name
     * @param array  $headers
     * @param string $disposition
     *
     * @return \Symfony\Component\HttpFoundation\StreamedResponse
     */
    public function fileFromString($content, $name, array $headers = [], $disposition = 'attachment')
    {
        return response()->streamDownload(function () use ($content) {
            echo $content;
        }, $name, [
            'Content-Type' => MimeType::from($name),
        ] + $headers, $disposition);
    }


С blob'ом должно быть +- так-же. Но повторюсь, что это edge case, и обычно так делать не стоит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы