Загрузка файлов - одна из распространенных функций, которую использует большинство приложений, и все же это одна из тех вещей, с которыми, как я вижу, многие люди испытывают трудности.
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 File Uploader предлагает простой способ загрузки файлов на различные диски.
Основная цель пакета - убрать повторяющийся и громоздкий код и упростить его до нескольких простых методов.
composer require erlandmuchasaj/laravel-file-uploader
Был ли он полезен?
Дайте мне знать в разделе комментариев ниже, если вы когда-либо использовали этот пакет в каком-либо из своих проектов.
Не забудьте поставить лайк и прокомментировать.
Следите за мной, чтобы получить больше советов по веб-разработке, новые пакеты и многое другое.
Спасибо за чтение.