yii2tech/file-storage
最新稳定版本:1.1.4
Composer 安装命令:
composer require yii2tech/file-storage
包简介
File storage abstraction layer for Yii2
README 文档
README
File Storage Extension for Yii 2
This extension provides file storage abstraction layer for Yii2.
For license information check the LICENSE-file.
Installation
The preferred way to install this extension is through composer.
Either run
php composer.phar require --prefer-dist yii2tech/file-storage
or add
"yii2tech/file-storage": "*"
to the require section of your composer.json.
If you wish to use Amazon S3 storage, you should also install aws/aws-sdk-php version 2. Either run
php composer.phar require --prefer-dist aws/aws-sdk-php:~2.0
or add
"aws/aws-sdk-php": "~2.0"
to the require section of your composer.json.
If you wish to use MongoDB storage, you should also install yiisoft/yii2-mongodb version 2.1. Either run
php composer.phar require --prefer-dist yiisoft/yii2-mongodb:~2.1.0
or add
"yiisoft/yii2-mongodb": "2.1.0"
to the require section of your composer.json.
Usage
This extension provides file storage abstraction layer for Yii2. This abstraction introduces 2 main terms: 'storage' and 'bucket'. 'Storage' - is a unit, which is able to store files using some particular approach. 'Bucket' - is a logical part of the storage, which has own specific attributes and serves some logical mean. Each time you need to read/write a file you should do it via particular bucket, which is always belongs to the file storage.
Example application configuration:
return [ 'components' => [ 'fileStorage' => [ 'class' => 'yii2tech\filestorage\local\Storage', 'basePath' => '@webroot/files', 'baseUrl' => '@web/files', 'dirPermission' => 0775, 'filePermission' => 0755, 'buckets' => [ 'tempFiles' => [ 'baseSubPath' => 'temp', 'fileSubDirTemplate' => '{^name}/{^^name}', ], 'imageFiles' => [ 'baseSubPath' => 'image', 'fileSubDirTemplate' => '{ext}/{^name}/{^^name}', ], ] ], // ... ], // ... ];
Example usage:
$bucket = Yii::$app->fileStorage->getBucket('tempFiles'); $bucket->saveFileContent('foo.txt', 'Foo content'); // create file with content $bucket->deleteFile('foo.txt'); // deletes file from bucket $bucket->copyFileIn('/path/to/source/file.txt', 'file.txt'); // copy file into the bucket $bucket->copyFileOut('file.txt', '/path/to/destination/file.txt'); // copy file from the bucket var_dump($bucket->fileExists('file.txt')); // outputs `true` echo $bucket->getFileUrl('file.txt'); // outputs: 'http://domain.com/files/f/i/file.txt'
Following file storages are available with this extension:
- [[\yii2tech\filestorage\local\Storage]] - stores files on the OS local file system.
- [[\yii2tech\filestorage\sftp\Storage]] - stores files using SSH2 SFTP.
- [[\yii2tech\filestorage\amazon\Storage]] - stores files using Amazon simple storage service (S3).
- [[\yii2tech\filestorage\mongodb\Storage]] - stores files using MongoDB GridFS.
- [[\yii2tech\filestorage\hub\Storage]] - allows combination of different file storages.
Please refer to the particular storage class for more details.
Heads up! Some of the storages may require additional libraries or PHP extensions, which are not required with this package by default, to be installed. Please check particular storage class documentation for the details.
Abstraction usage
Each provided storage implements same interface for the files processing. Thus each storage can substitute another one, unless program code follows this interface. This allows you to switch between different storages without being need to adjust program source code. For example, at production server you may need to use SFTP for files storing and your application config looks like following:
return [ 'components' => [ 'fileStorage' => [ 'class' => 'yii2tech\filestorage\sftp\Storage', 'ssh' => [ 'host' => 'file.server.com', 'username' => 'user', 'password' => 'some-password', ], 'basePath' => '/var/www/html/files', 'baseUrl' => 'http://file.server.com/files', 'buckets' => [ 'temp', 'item', ] ], // ... ], // ... ];
However, at development environment you may use simple local file storage instead:
return [ 'components' => [ 'fileStorage' => [ 'class' => 'yii2tech\filestorage\local\Storage', 'basePath' => '@webroot/files', 'baseUrl' => '@web/files', 'buckets' => [ 'temp', 'item', ] ], // ... ], // ... ];
You can also combine several different storages using [[\yii2tech\filestorage\hub\Storage]], if necessary:
return [ 'components' => [ 'fileStorage' => [ 'class' => 'yii2tech\filestorage\hub\Storage', 'storages' => [ [ 'class' => 'yii2tech\filestorage\sftp\Storage', 'ssh' => [ 'host' => 'file.server.com', 'username' => 'user', 'password' => 'some-password', ], 'basePath' => '/var/www/html/files', 'baseUrl' => 'http://file.server.com/files', 'buckets' => [ 'item', ] ], [ 'class' => 'yii2tech\filestorage\local\Storage', 'basePath' => '@webroot/files', 'baseUrl' => '@web/files', 'buckets' => [ 'temp', ] ] ], ], // ... ], // ... ];
Accessing files by URL
Almost all file storage implementation, implemented in this extension, provide mechanism for accessing stored files via web URL. Actual mechanism implementation may vary depending on particular storage. For example: [[\yii2tech\filestorage\local\Storage]] allows setup of the URL leading to its root folder, creating URL for particular file appending its name to base URL, while [[\yii2tech\filestorage\amazon\Storage]] uses S3 built-in object URL composition.
In order to get URL leading to the stored file, you should use [[\yii2tech\filestorage\BucketInterface::getFileUrl()]] method:
$bucket = Yii::$app->fileStorage->getBucket('tempFiles'); $fileUrl = $bucket->getFileUrl('image.jpg');
In case particular storage does not provide native URL file access, or it is not available or not desirable by some reason,
you can setup composition of the file URL via Yii URL route mechanism. You need to setup baseUrl to be an array, containing
route, which leads to the Yii controller action, which will return the file content. For example:
return [ 'components' => [ 'fileStorage' => [ 'class' => 'yii2tech\filestorage\local\Storage', 'baseUrl' => ['/file/download'], // ... ], // ... ], // ... ];
With this configuration getFileUrl() method will use current application URL manager to create URL. Doing so it
will add bucket name as bucket parameter and file name as filename parameter. For example:
use yii\helpers\Url; $bucket = Yii::$app->fileStorage->getBucket('images'); $fileUrl = $bucket->getFileUrl('logo.png'); $manualUrl = Url::to(['/file/download', 'bucket' => 'images', 'filename' => 'logo.png']); var_dump($fileUrl === $manualUrl); // outputs `true`
You may setup [[\yii2tech\filestorage\DownloadAction]] to handle file content web access. For example:
class FileController extends \yii\web\Controller { public function actions() { return [ 'download' => [ 'class' => 'yii2tech\filestorage\DownloadAction', ], ]; } }
Tip: usage of the controller action for the file web access usually slower then native mechanism provided by file storage, however, you may put some extra logic into it, like allowing file access for logged in users only.
Processing of the large files
Saving or reading large files, like > 100 MB, using such methods like [[\yii2tech\filestorage\BucketInterface::saveFileContent()]] or [[\yii2tech\filestorage\BucketInterface::getFileContent()]], may easily exceed PHP memory limit, breaking the script. You should use [[\yii2tech\filestorage\BucketInterface::openFile()]] method to create a file resource similar to the one created via [[fopen()]] PHP function. Such resource can be read or written by blocks, keeping memory usage low. For example:
$bucket = Yii::$app->fileStorage->getBucket('tempFiles'); $resource = $bucket->openFile('new_file.dat', 'w'); fwrite($resource, 'content part1'); fwrite($resource, 'content part2'); // ... fclose($resource); $resource = $bucket->openFile('existing_file.dat', 'r'); while (!feof($resource)) { echo fread($resource, 1024); } fclose($resource);
Note: You should prefer usage of simple modes like
randw, avoiding complex ones likew+, as they may be not supported by some storages.
Logging
Each file operation performed by file storage component is logged.
In order to setup a log target, which can capture all entries related to file storage, you should
use category yii2tech\filestorage\*. For example:
return [ // ... 'components' => [ // ... 'log' => [ // ... 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'logFile' => '@runtime/logs/file-storage.log', 'categories' => ['yii2tech\filestorage\*'], ], // ... ], ], ], ];
yii2tech/file-storage 适用场景与选型建议
yii2tech/file-storage 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 198.84k 次下载、GitHub Stars 达 118, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「mongodb」 「file」 「abstraction」 「storage」 「amazon」 「s3」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 yii2tech/file-storage 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 yii2tech/file-storage 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 yii2tech/file-storage 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Generates Symfony2 documents, forms and CRUD
The file manager intended for using Laravel with CKEditor / TinyMCE / Colorbox
Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.
ADOdb is a PHP database abstraction layer library
Slimmed down concise interfaces and query builder for database queries and transactions which can be layered / decorated.
A package to allow laravel/passport use with mongodb/laravel-mongodb
统计信息
- 总下载量: 198.84k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 121
- 点击次数: 23
- 依赖项目数: 5
- 推荐数: 0
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 未知