Laravel. Файловое хранилище
15.09.2020
Теги: Laravel • PHP • URL • Web-разработка • Директория • Класс • Теория • Файл • Фреймворк
Laravel предоставляет мощную абстракцию для работы с файловой системой благодаря php-пакету Flysystem от Франка де Жонге. Настройки файловой системы находятся в файле config/filesystems.php
. В нём можно настроить так называемые «диски». Каждый диск представляет собой определенный драйвер и место хранения. В конфигурационном файле имеются примеры для каждого поддерживаемого драйвера.
return [ /* ... */ 'default' => env('FILESYSTEM_DRIVER', 'local'), /* ... */ 'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], ], /* ... */ 'links' => [ public_path('storage') => storage_path('app/public'), ], /* ... */ ];
Функция storage_path()
возвращает полный путь к директории storage
. Также можно использовать функцию storage_path()
для получения полного пути к указанному файлу относительно директории хранилища:
// вернет полный путь /var/www/server.com/storage $path = storage_path(); // вернет /var/www/server.com/storage/app/file.txt $path = storage_path('app/file.txt');
Функция public_path()
возвращает полный путь к директории public
, которая является корнем веб-сервера, т.е. доступна из веб. Также можно использовать функцию public_path()
для получения полного пути к указанному файлу или директории:
// вернет полный путь /var/www/server.com/public $path = public_path(); // вернет /var/www/server.com/public/index.php $path = public_path('index.php');
Сразу после установки Laravel доступны диски local
и public
, использующие драйвер local
. Для диска local
место хранения — директория storage/app
, для диска public
место хранения — директория storage/app/public
. Диск local
является диском по умолчанию.
Чтобы сделать файлы диска public
доступными через веб, надо создать символьную ссылку из public/storage
на storage/app/public
. Директория public
проекта Laravel — является корневой директорией сервера, поэтому файл storage/app/public/image.jpg
будет доступен через веб как http://server.com/storage/image.jpg
.
> php artisan storage:link
Какие символьные ссылки создавать — задается в файле конфигурации, см. выше. Когда файл сохранён на диске и создана символьная ссылка, можно создать URL к файлу с помощью хелпера asset()
или метода url()
фасада Storage
.
<img src="{{ asset('storage/images/image.jpg') }}" alt="" />
<img src="{{ Storage::disk('public')->('images/image.jpg') }}" alt="" />
Методы фасада Storage
При использовании драйвера local
все файловые операции выполняются относительно директории root
, определенной в конфигурационном файле. Для диска local
директория root
— это storage/app
, для диска public
директория root
— это storage/app/public
.
// файл будет сохранен в storage/app/data/file.txt Storage::disk('local')->put('data/file.txt', 'Some file content');
При вызове метода фасада Storage
без предварительного вызова метода disk()
— вызов будет автоматически передан диску по умолчанию.
// файл будет сохранен в storage/app/images/image.jpg Storage::put('images/image.jpg', $contents); // содержимое файла
// файл будет сохранен в storage/app/images/image.jpg Storage::put('images/image.jpg', $resource); // php-ресурс файла
Метод putFile()
помещает содержимое указанного файла (в виде экземпляра класса Illuminate\Http\File
или Illuminate\Http\UploadedFile
) в указанный каталог, но с возложением контроля над всей потоковой обработкой и формированием уникального имени файла на Laravel. Метод возвращает путь к файлу, включая сформированное имя.
// автоматическое формирование уникального имени, файл будет сохранен // как storage/app/images/L6ceLZQtmzvtR5lYEMqViu8BB8Fta8sWiD0xzXFw.jpeg Storage::disk('local')->putFile('images', new File('/path/to/photo'));
// вручную указываем имя для, файл будет сохранен как storage/app/images/photo.jpg Storage::disk('local')->putFileAs('images', new File('/path/to/photo'), 'photo.jpg');
Методом get()
можно получать содержимое файла. Он возвращает сырую строку содержимого файла.
$contents = Storage::get('images/image.jpg');
Методом exists()
можно определить существование файла на диске:
$exists = Storage::exists('image.jpg');
Метод url()
позволяет получить URL файла. При использовании диска local
будет возвращён URL вида /storage/images/image.jpg
. При использовании диска public
будет возвращён полный URL, домен сайта будет получен из .env
-файла в корне проекта, это настройка APP_URL
.
// возвращает URL /storage/images/image.jpg $url = Storage::disk('local')->url('images/image.jpg'); // возвращает URL http://server.com/images/image.jpg $url = Storage::disk('public')->url('images/image.jpg');
Метод size()
позволяет получить размер файла в байтах:
$size = Storage::size('images/image.jpg');
Метод copy()
копирует файл, метод move()
перемещает файл:
Storage::copy('images/old-image.jpg', 'images/new-image.jpg'); Storage::move('images/old-image.jpg', 'images/new-image.jpg');
Метод prepend()
добавляет содержимое в начало файла, метод append()
добавляет содержимое в конец файла:
Storage::prepend('logs/some.log', 'Some log text'); Storage::append('logs/some.log', 'Some log text');
Метод delete()
удаляет указанный файл:
Storage::delete('images/image.jpg');
Метод files()
возвращает массив имен файлов в указанной директории. А метод allFiles()
— массив имен файлов в указанной директории и во всех поддиректориях.
Метод directories()
возвращает массив имен директорий в указанной директории. А метод allDirectories()
— массив имен директорий в указанной директории и во всех поддиректориях.
Метод makeDirectory()
создает новую директорию, а метод deleteDirectory()
удаляет указанную директорию.
Загрузка файлов
В Laravel очень просто сохранять загружаемые файлы методом store()
на экземпляре загружаемого файла:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class UserAvatarController extends Controller { /** * Обновление аватара пользователя. * * @param Request $request * @return Response */ public function update(Request $request) { $path = $request->file('avatar')->store('avatars'); return $path; } }
Мы указываем только директорию avatars
, а имя файла будет сформировано автоматически. Метод вернёт путь к файлу, поэтому можно сохранить в БД весь путь, включая сгенерированное имя. Файл будет сохранен на диск по умолчанию, но можно указать диск вторым аргументом метода store()
.
$path = $request->file('avatar')->store('avatars', 'public');
Также можно использовать метод putFile()
фасада Storage
для выполнения аналогичного действия:
// будет использован диск по умолчанию $path = Storage::putFile('avatars', $request->file('avatar'));
// явное указание диска для сохранения $path = Storage::disk('public')->putFile('avatars', $request->file('avatar'));
Чтобы задать свое имя файла и (опционально) диск для сохранения, можно использовать метод storeAs()
:
// будет использован диск по умолчанию $path = $request->file('avatar')->storeAs( 'avatars', // директория, куда сохранять $request->user()->id // имя файла );
// явное указание диска для сохранения $path = $request->file('avatar')->storeAs( 'avatars', // директория, куда сохранять $request->user()->id, // имя файла 'public' // диск, куда сохранять );
Также можно использовать метод putFileAs()
фасада Storage
для выполнения аналогичного действия:
// будет использован диск по умолчанию $path = Storage::putFileAs( 'avatars', // директория, куда сохранять $request->file('avatar'), $request->user()->id // имя файла );
// явное указание диска для сохранения $path = Storage::disk('public')->putFileAs( 'avatars', // директория, куда сохранять $request->file('avatar'), $request->user()->id // имя файла );
Чтобы получить оригинальное имя загруженного файла:
$name = $request->file('avatar')->getClientOriginalName();
Чтобы получить оригинальное расширение загруженного файла:
$extension = $request->file('avatar')->extension();
Поиск: Laravel • PHP • URL • Web-разработка • Директория • Класс • Теория • Файл • Фреймворк • Storage