File System
Компонент для работы с файловыми хранилищами на основе Flysystem.
Он позволяет работать как с локальной файловой системой, так и с удаленными хранилищами используя единый интерфейс. Например с Amazon AWS S3, Azure Blob Storage, Yandex Objet Storage, BunnyCdn, Google Cloud Storage, WebDav, FTP, SFTP и др.
Класс для работы с локальной файловой системой входит в состав Cotonti Lib и не требует доплнительной установки других библиотек. Его интерфейс совместим с \League\Flysystem\FilesystemOperator
и они взаимозаменяемы.
Для подключения другой (удаленной) файловой системы нужно установить Flysystem и нужный адаптер.
Для этого в composer.json
нужно добавить строки:
1 2 |
"league/flysystem": "^3.0", "league/flysystem-aws-s3-v3": "^3.0" |
В этом примере мы добавили адаптер для файловых хранилищ, поддерживающий AWS S3.
И выполнить в командной строке:
1 |
composer update |
Composer для Windows имеет баг который может в файле lib/composer/autoload_static.php
сделать что то такое:
1 2 3 |
public static $fallbackDirsPsr4 = array ( 0 => 'C:\\OpenServerData\\domains\\my-site.loc\\public_html\\lib' , ); |
Надо вернуть как было:
1 2 3 |
public static $fallbackDirsPsr4 = array ( 0 => DIR . '/../..' . '/lib' , ); |
Теперь адатер файловой системы готов к использованию в коде Ваших расширений.
Для создания экземпляра можно воспользоваться инструкцией к соотвествующему адаптеру или воспользоваться "фабрикой" из Cotonti Lib.
Использование фабрики является предпочтительным при создании расширений т.к. позволяет конфигурировать подключения к файловым системам и использовать нужные в зависимости от конфигурации.
Конфигурирование файловых систем.
В файл datas/config.php
нужно добавить элемент такого вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$cfg [ 'filesystem' ] = [ // Подключение к Yandex Object Storage 'Yandex.Cloud' => [ 'adapter' => '\League\Flysystem\AwsS3V3\AwsS3V3Adapter' , 'config' => [ //'version' => 'latest', // Optional 'region' => 'ru-central1' , 'bucket' => 'my-bucket-name' , 'accessKey' => 'MyAccessKey' , 'secretKey' => 'MySecretKey' , // install: composer require league/flysystem-path-prefixing:^3.3 to use prefix //'pathPrefix' => 'a/path/prefix', ], ], // Подключение к другому серверу по FTP 'FTP' => [ 'adapter' => '\League\Flysystem\Ftp\FtpAdapter' , 'config' => [ 'client' => [ 'host' => 'my-pretty-host.tld' , 'root' => '/var/www/files/storage/here' , 'username' => 'server-user' , 'password' => 'someThingReallySecret' , ], // install: composer require league/flysystem-path-prefixing:^3.3 to use prefix //'pathPrefix' => 'a/path/prefix', ], ], // Подключение к BunnyCDN 'BunnyCDN' => [ 'adapter' => '\PlatformCommunity\Flysystem\BunnyCDN\BunnyCDNAdapter' , 'config' => [ 'storageZoneName' => 'test-files' , 'apiKey' => 'my-api-key' , //'region' => 'de', // optional // install composer require league/flysystem-path-prefixing:^3.3 to use prefix //'pathPrefix' => 'a/path/prefix', ], ], ]; |
В этом примере мы сконфигурировали подключение к Yandex Object Storage и к удаленному серверу по FTP.
Ключ массива - это название подключения, может быть любым.
'adapter' - имя класса адаптера. Поддерживаются и псевдонимы. Например вместо '\League\Flysystem\AwsS3V3\AwsS3V3Adapter'
можно использовать 'Aws'
или 'AwsS3'
. Фабрика их поймет.
'config' - конфигурация подключения. Т.к. файловые системы имют очень разные API и способы подключения, то для каждого адаптера 'config' свой.
За подробностями можно обратиться к описанию самого адаптера и в код файла фабрики.
Если вы хотите добавить в фабрику подключение адаптера, которого в ней нет или создать подключение с более специфичной конфигурацией, то это можно сделать либо через хук filesystem.getFilesystem
либо определив функцию cot_getFilesystem($fileSystemName, $pathPrefix)
.
Пример использования:
1 2 3 4 5 6 7 |
use \filesystem\FilesystemFactory; // Получить экземпляр класса файловой системы по имени подлючения из конфига выше $filesystem = FilesystemFactory::getFilesystem( 'Yandex.Cloud' ); // Запись в файл $filesystem ->write( $path , $contents ); |
Методы класса \League\Flysystem\Filesystem
описаны в документации.
Комментарии:
Оставить комментарий:
* Просьба все технические вопросы, которые могут потребовать обсуждения, задавать на форуме.
** все некорректные и рекламные посты будут удаляться, ненормативная лексика и оскорбительные высказывания запрещаются.