Загрузка файлов в Laravel 10

Загрузка файлов в Laravel 10

Загрузка файлов - одна из распространенных функций, которую использует большинство приложений, и все же это одна из тех вещей, с которыми, как я вижу, многие люди испытывают трудности.

Laravel предлагает простой API для работы с локальной файловой системой:

Storage::putFileAs('images', $request->file('file'));

Часто пользователю необходимо обработать проверку файла, его размер, размеры, имя, видимость, путь, диск и т.д.

Мы хотим создать форму, которая позволит нам загрузить файл и отправить его - а маршрут будет принимать эту форму, проверять вводимые данные и обрабатывать загрузку.

В этой статье я сделаю пошаговое руководство по загрузке файлов на Laravel 10 с использованием пакета erlandmuchasaj/laravel-file-uploader. 
В этом учебнике мы создадим 2 маршрута.
Один для создания формы, куда пользователь будет загружать файл, а другой маршрут для загрузки файла с помощью пакета.
Мы создадим простую форму, используя компоненты Bootstrap Form UI.

Прежде всего, создадим новый проект Laravel.
Откройте инструмент командной строки и выполните следующую команду, чтобы создать проект Laravel с нуля.

composer create-project laravel/laravel --prefer-dist laravel-file-uploader

Затем мы заходим в только что созданный каталог проекта:

cd laravel-file-uploader

Затем мы устанавливаем пакет laravel-file-uploader.

composer require erlandmuchasaj/laravel-file-uploader

После этого мы создаем символическую ссылку для доступа к файлам, которые будут общедоступными.
По умолчанию публичный диск использует локальный драйвер и хранит свои файлы в storage/app/public.

Чтобы сделать эти файлы доступными из интернета, необходимо создать символическую ссылку с public/storage на storage/app/public.

Для создания символической ссылки можно использовать команду storage:link Artisan:

php artisan storage:link

Создайте маршруты.

Перейдите в route/web.php и создайте 2 дополнительных маршрута. Первый обрабатывает визуализацию формы, а второй - POST-запрос формы.

use ErlandMuchasaj\LaravelFileUploader\FileUploader; // <= import the package
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;


// visualize the form
Route::get('/files', function (Request $request) {
    return view('files');
})->name('files');

// handle the post request
Route::post('/files', function (Request $request) {

    $max_size = (int) ini_get('upload_max_filesize') * 1000;

    $extensions = implode(',', FileUploader::images());

    $request->validate([
        'file' => [
            'required',
            'file',
            'image',
            'mimes:' . $extensions,
            'max:'.$max_size,
        ]
    ]);

    $file = $request->file('file');

    $response = FileUploader::store($file);

    return redirect()
            ->back()
            ->with('success','File has been uploaded.')
            ->with('file', $response);
})->name('files.store');

Создание файлов лезвия в Laravel.

В этом шаге мы создадим представление, в котором будет размещена форма загрузчика файлов.
Создайте новый файл в resources/views/files.blade.php и поместите в него следующее содержимое:

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>File uploader</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
    </head>
    <body class="antialiased">
        <div class="container">
            <div class="row">
                <div class="col-12">
                    @if ($message = Session::get('success'))
                        <div class="alert alert-success alert-dismissible fade show" role="alert">
                            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
                            <strong>{{ $message }}</strong>
                        </div>
                    @endif
                    @if (count($errors) > 0)
                        <div class="alert alert-danger alert-dismissible fade show" role="alert">
                            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
                            <ul class="mb-0 p-0">
                                @foreach ($errors->all() as $error)
                                    <li>{{ $error }}</li>
                                @endforeach
                            </ul>
                        </div>
                    @endif
                </div>
                <div class="col-12 py-5">
                    <div class="card my-5">
                        <div class="card-header">
                           <h3>Laravel File Uploader</h3>
                        </div>
                        <div class="card-body">
                            <form method="POST" action="{{ route('files.store')  }}" enctype="multipart/form-data">
                                @method('POST')
                                @csrf
                                <div class="mb-3">
                                    <label for="formFileLg" class="form-label">File input example</label>
                                    <input name="file" class="form-control form-control-lg" id="formFileLg"
                                           type="file">
                                </div>
                                <div class="mb-3">
                                    <button type="submit" value="submit" class="btn btn-primary">Upload</button>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
    </body>
</html>

Это покажет пользователю форму для загрузки файлов. Форма в этом шаблоне представления указывает на маршрут с именем files.store, который мы создали ранее в файле routes/web.php.

Laravel форма загрузки

Это все для данного руководства.

Если вам нужна дополнительная информация об используемом пакете, вы можете прочитать ниже:

Простой, но мощный пакет Laravel для загрузки файлов

Laravel File Uploader предлагает простой способ загрузки файлов на различные диски.
Основная цель пакета - убрать повторяющийся и громоздкий код и упростить его до нескольких простых методов.

composer require erlandmuchasaj/laravel-file-uploader

Был ли он полезен?

Дайте мне знать в разделе комментариев ниже, если вы когда-либо использовали этот пакет в каком-либо из своих проектов.

Не забудьте поставить лайк и прокомментировать.

Следите за мной, чтобы получить больше советов по веб-разработке, новые пакеты и многое другое.

Спасибо за чтение.