Laravel. Файловое хранилище

15.09.2020

Теги: LaravelPHPURLWeb-разработкаДиректорияКлассТеорияФайлФреймворк

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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.