Загрузка файла

Сначала надо убедиться, что есть папка 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 будет очень сложно.