Загрузка файла
Сначала надо убедиться, что есть папка public/storage/, которая является ссылкой (симлинк) к папке storage/app/public/. Если папки нет, то её надо создать через команду ниже:
php artisan storage:link
В данной папке будут храниться загруженные файлы.
Затем надо создать форму для загрузки файла.
<form method="post" enctype="multipart/form-data"> @csrf <!-- с версии Laravel 5.6 --> {{ csrf_field() }} <!-- до версии Laravel 5.5 --> <!-- поле для загрузки файла --> <input type="file" name="userfile"> <input type="submit"> </form>
Для загрузки файла надо указать атрибут enctype="multipart/form-data"
, т.к. без него файлы не будут загружаться на сайт.
Загрузка файла происходит через метод Storage::putFileAs()
.
use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; // … public function upload(Request $request) { // загрузка файла if ($request->isMethod('post') && $request->file('userfile')) { $file = $request->file('userfile'); $upload_folder = 'public/folder'; $filename = $file->getClientOriginalName(); // image.jpg Storage::putFileAs($upload_folder, $file, $filename); } }
Стоит обратить внимание на папку для загрузки «public/folder». Первая папка должна быть указана «public», чтобы она была доступна через URL.
Загруженный файл будет доступен по ссылке «storage/folder/image.jpg».
Валидация
Перед загрузкой файла можно выполнить метод $request->validate()
, в котором можно указать валидацию для загружаемого файла.
if ($request->isMethod('post') && $request->file('userfile')) { $request->validate([ // файл должен быть картинкой (jpeg, png, bmp, gif, svg или webp) 'userfile' => 'image', // поддерживаемые MIME файла (image/jpeg, image/png) 'userfile' => 'mimetypes:image/jpeg,image/png', ]); // … }
При загрузке файла, поддерживаемый формат надо проверять не по расширению (например .png или .jpg), а по MIME-файла (image/jpeg), потому что расширение можно вручную поменять, а поменять MIME будет очень сложно.
Поддержать автора