РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
207 of 274 menu

Временная загрузка файлов

Временная загрузка файлов в Livewire реализована через трейт WithFileUploads. Когда пользователь выбирает файл через поле input type="file" с директивой wire:model, Livewire автоматически загружает этот файл во временное хранилище на сервере. Объект загруженного файла в компоненте представлен классом TemporaryUploadedFile, который расширяет стандартный IlluminateHttpUploadedFile. Этот механизм позволяет выполнять валидацию, предпросмотр и манипуляции с файлами до того, как они будут окончательно сохранены.

Синтаксис

Для использования временной загрузки необходимо подключить трейт LivewireWithFileUploads в компоненте. Сама загрузка происходит автоматически при обновлении свойства, связанного с полем файла через wire:model. Объект файла доступен в свойстве компонента и может быть сохранен с помощью методов трейта.

<?php namespace AppLivewire; use LivewireComponent; use LivewireWithFileUploads; class UploadForm extends Component { use WithFileUploads; public $photo; public function save() { $path = $this->photo->store('photos'); } public function render() { return view('livewire.upload-form'); } } ?>
<form wire:submit.prevent="save"> <input type="file" wire:model="photo"> <button type="submit">Upload</button> </form>

Пример

Давайте создадим компонент для загрузки одного файла и выведем информацию о нем после загрузки:

<?php namespace AppLivewire; use LivewireComponent; use LivewireWithFileUploads; class FileUploader extends Component { use WithFileUploads; public $file; public $fileName = ''; public function upload() { $this->validate([ 'file' => 'required|file|max:1024', ]); $this->fileName = $this->file->getClientOriginalName(); $path = $this->file->store('uploads'); } public function render() { return view('livewire.file-uploader'); } } ?>
<div> @if ($fileName) <p>Uploaded: {{ $fileName }}</p> @endif <form wire:submit.prevent="upload"> <input type="file" wire:model="file"> @error('file') <span>{{ $message }}</span> @enderror <button type="submit">Upload</button> </form> </div>

Результат выполнения кода после выбора файла:

<div> <p>Uploaded: document.pdf</p> <form> <input type="file"> <button type="submit">Upload</button> </form> </div>

Пример

Теперь рассмотрим пример с множественной загрузкой файлов. Для этого свойство должно быть массивом, а в поле ввода добавляется атрибут multiple. Валидация также будет применена к каждому файлу:

<?php namespace AppLivewire; use LivewireComponent; use LivewireWithFileUploads; class MultiUploader extends Component { use WithFileUploads; public $files = []; public $uploadedFiles = []; public function upload() { $this->validate([ 'files.*' => 'required|file|max:2048|mimes:jpg,png,pdf', ]); foreach ($this->files as $file) { $path = $file->store('public/uploads'); $this->uploadedFiles[] = $file->getClientOriginalName(); } } public function render() { return view('livewire.multi-uploader'); } } ?>
<div> @if ($uploadedFiles) <ul> @foreach ($uploadedFiles as $name) <li>{{ $name }}</li> @endforeach </ul> @endif <form wire:submit.prevent="upload"> <input type="file" wire:model="files" multiple> @error('files.*') <span>{{ $message }}</span> @enderror <button type="submit">Upload All</button> </form> </div>

Результат выполнения кода после загрузки двух файлов:

<div> <ul> <li>image1.jpg</li> <li>image2.png</li> </ul> <form> <input type="file" multiple> <button type="submit">Upload All</button> </form> </div>

Смотрите также

  • трейт WithFileUploads,
    который добавляет функциональность для работы с загрузками
  • метод store,
    который сохраняет временный файл в указанную директорию
  • метод storeAs,
    который сохраняет файл с конкретным именем
  • метод storePublicly,
    который сохраняет файл в публичную директорию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить