Работа с файлами / хранение в облаке

Введение

Laravel предоставляет чудесную абстракцию для работы с файловой системой - Flysystem от Frank de Jonge. У Flysystem есть драйвера для работы с Amazon S3, Rackspace Cloud Storage, и, конечно, с локальной файловой системой. Теперь невероятно просто переключиться с хранения файлов на сервере на хранение файлов на S3!

Настройка

Настройки Flysystem находятся в файле config/filesystems.php. Внутри него вы можете настроить несколько 'disks'. Каждый диск представляет свой тип хранения - локальная файловая система или облачные хранилища. В файле настроек уже есть примеры конфигурации дисков для каждого из поддерживаемых хранилищ.

Перед использованием S3 или Rackspace вы должны установить при помощи Composer соответствующие пакеты:

  • Amazon S3: "league/flysystem-aws-s3-v2": "~1.0"
  • Rackspace: "league/flysystem-rackspace": "~1.0"

Вы можете сконфигурировать несколько дисков, с одним и тем же драйвером.

Обратите внимание, что когда вы используете драйвер 'local', все пути в командах будут считаться от пути, заданного в параметре 'root'. По умолчанию это папка storage/app. Например, этот код создаст файл storage/app/file.txt:

Storage::disk('local')->put('file.txt', 'Contents');

Основы использования

Для взаимодействия с вашими дисками вы можете использовать фасад Storage или внедрить в конструктор класса объект, реализующий Illuminate\Contracts\Filesystem\Factory, используя сервис-контейнер.

Подключение диска

$disk = Storage::disk('s3');

$disk = Storage::disk('local');

Определение, существует ли файл

$exists = Storage::disk('s3')->exists('file.jpg');

Выполнение метода на дефолтном диске

if (Storage::exists('file.jpg'))
{
    //
}

Чтение файла

$contents = Storage::get('file.jpg');

Запись в файл

Storage::put('file.jpg', $contents);

Добавление контента в начало файла

Storage::prepend('file.log', 'Prepended Text');

Добавление контента в конец файла

Storage::append('file.log', 'Appended Text');

Удвление файла

Storage::delete('file.jpg');

Storage::delete(['file1.jpg', 'file2.jpg']);

Копировать файл

Storage::copy('old/file1.jpg', 'new/file1.jpg');

Переместить файл

Storage::move('old/file1.jpg', 'new/file1.jpg');

Получить размер файла

$size = Storage::size('file1.jpg');

Получить время последней модификации файла (UNIX)

$time = Storage::lastModified('file1.jpg');

Получить все файлы в директории

$files = Storage::files($directory);

// И из всех поддиректорий - рекурсивно...
$files = Storage::allFiles($directory);

Получить все поддиректори

$directories = Storage::directories($directory);

// рекурсивно...
$directories = Storage::allDirectories($directory);

Создать директорию

Storage::makeDirectory($directory);

Удалить директорию

Storage::deleteDirectory($directory);