itstructure / yii2-multi-format-uploader
为 Yii2 框架提供的上传文件到本地或 S3 亚马逊存储的模块
Requires
- php: >=7.1.0
- aws/aws-sdk-php: ~3.55.7
- itstructure/yii2-field-widgets: ^1.2.2
- yiisoft/yii2: 2.*
- yiisoft/yii2-bootstrap: ^2.0
- yiisoft/yii2-imagine: ~2.1.0
README
介绍
MFUploader -- 用于 Yii2 框架的模块,可以将某些类型的文件上传到本地或 S3 亚马逊存储。MFUploader 模块提供了以下选项
- 将文件上传到本地存储。
- 将文件上传到远程亚马逊 S3 存储。
- 支持文件格式:图像、音频、视频、应用程序、文本。
- 将上传的文件与外部应用程序所有者(页面、文章、帖子等)相关联。
- 管理内部相册:imageAlbum、audioAlbum、videoAlbum、applicationAlbum、textAlbum、otherAlbum。
- 将上传的文件与内部相册(所有者)相关联。
- 将内部相册与外部所有者(页面、文章、帖子等)相关联。
为了处理图像二进制内容,它使用 Yii2 imagine。为了与亚马逊合作,它使用 AWS SDK。
以下是基于使用此 MFUploader 模块的基项目示例
您可以在我的 个人网站 上查看附加模块描述。
要求
- php >= 7.1
- composer
- MySql >= 5.5
- 以下 PHP 扩展之一:GD|Imagick|Gmagick
安装
基本安装
通过 composer
composer require itstructure/yii2-multi-format-uploader ~3.2.7
如果您正在从本地服务器目录测试此包
在应用 composer.json
文件中设置仓库,如下所示
"repositories": [ { "type": "path", "url": "../yii2-multi-format-uploader", "options": { "symlink": true } } ],
这里,
yii2-multi-format-uploader - 目录名,与应用程序和包含 yii2 多格式上传程序包的目录级别相同。
然后运行命令
composer require itstructure/yii2-multi-format-uploader:dev-master --prefer-source
应用模块迁移
为此,请执行以下操作,如果尚未完成
-
在应用程序 console 配置文件中定义 mfuploader 模块
use Itstructure\MFUploader\Module as MFUModule;
'modules' => [ 'mfuploader' => [ 'class' => MFUModule::class, ], ],
-
在位于应用程序根目录中的 yii 文件中设置 @mfuploader 别名
$application = new yii\console\Application($config); \Yii::setAlias('@mfuploader', $application->getModule('mfuploader')->getBasePath()); $exitCode = $application->run();
或者
use Itstructure\MFUploader\Module as MFUModule;
$application = new yii\console\Application($config); \Yii::setAlias('@mfuploader', MFUModule::getBaseDir()); $exitCode = $application->run();
-
在控制台中运行命令
yii migrate --migrationPath=@mfuploader/migrations
数据库结构
用法
主要属性
模块的 名称:mfuploader
用于类的 命名空间:Itstructure\MFUploader
。
用于访问模块根目录的 别名:@mfuploader
。
应用程序配置
基本应用程序配置必须如下所示
use Itstructure\MFUploader\Module as MFUModule; use Itstructure\MFUploader\controllers\ManagerController; use Itstructure\MFUploader\controllers\upload\{ LocalUploadController, S3UploadController }; use Itstructure\MFUploader\controllers\album\{ ImageAlbumController, AudioAlbumController, VideoAlbumController, ApplicationAlbumController, TextAlbumController, OtherAlbumController }; use Itstructure\MFUploader\components\{ LocalUploadComponent, S3UploadComponent };
'modules' => [ 'mfuploader' => [ 'class' => MFUModule::class, // REQUIRED 'layout' => ...path to layout..., // NOT REQUIRED 'view' => ...view component config..., // NOT REQUIRED 'controllerMap' => [ // CUSTOM 'upload/local-upload' => LocalUploadController::class, 'upload/s3-upload' => S3UploadController::class, 'managers' => ManagerController::class, 'image-album' => ImageAlbumController::class, 'audio-album' => AudioAlbumController::class, 'video-album' => VideoAlbumController::class, 'application-album' => ApplicationAlbumController::class, 'text-album' => TextAlbumController::class, 'other-album' => OtherAlbumController::class, ], 'accessRoles' => ['admin', 'manager', e.t.c...], // CUSTOM 'defaultStorageType' => MFUModule::STORAGE_TYPE_S3, // CUSTOM 'components' => [ // CUSTOM 'local-upload-component' => [ // CUSTOM 'class' => LocalUploadComponent::class, 'checkExtensionByMimeType' => false, 'uploadRoot' => dirname($_SERVER['SCRIPT_FILENAME']) ], 's3-upload-component' => [ // CUSTOM 'class' => S3UploadComponent::class, 'checkExtensionByMimeType' => false, 'credentials' => require __DIR__ . '/aws-credentials.php', 'region' => 'us-west-2', 's3DefaultBucket' => 'bucketname', ], ], 'publicBaseUrl' => 'http://your-site-address.com' ], ],
在这里,例如,publicBaseUrl
可以是项目域名(http://your-site-address.com
)。如果我们有 url
在 mediafiles
表中 \uploads\images\imagealbum\0d\3890\a947f268d6f9fd02d8a0d7e147da922c.jpg
,并且我们使用来自 mediafile
模型的 getViewUrl() 函数对本地文件,那么例如一个图像的链接到 <img>
标签的 src
属性将是
http://your-site-address.com/uploads/images/imagealbum/0d/3890/a947f268d6f9fd02d8a0d7e147da922c.jpg
注意:不需要配置两个组件:local-upload-component
和 s3-upload-component
。您必须根据 defaultStorageType
配置至少一个组件。
用于视图模板的文件字段
文件字段必须由 FileSetter
小部件渲染。
需要将上传的媒体文件的 ID 或 URL 发送到您的应用程序控制器,并在模型中设置。之后,将媒体文件 ID 与所有者相关联。
示例(对于图像文件)
use Itstructure\MFUploader\widgets\FileSetter; use Itstructure\MFUploader\Module as MFUModule; use Itstructure\MFUploader\interfaces\UploadModelInterface;
Container to display selected image. <div class="media"> <div id="mediafile-container"> </div> <div class="media-body"> <h4 id="title-container" class="media-heading"></h4> <div id="description-container"></div> </div> </div>
echo FileSetter::widget([ 'model' => $model, 'attribute' => UploadModelInterface::FILE_TYPE_IMAGE, 'neededFileType' => UploadModelInterface::FILE_TYPE_IMAGE, 'buttonName' => MFUModule::t('main', 'Set image'), 'options' => [ 'id' => Html::getInputId($model, UploadModelInterface::FILE_TYPE_IMAGE) ], 'mediafileContainer' => '#mediafile-container', 'titleContainer' => '#title-container', 'descriptionContainer' => '#description-container', 'owner' => 'post', // can be page, article, catalog e.t.c... 'ownerId' => {current owner id, post id, page id e.t.c.}, 'ownerAttribute' => UploadModelInterface::FILE_TYPE_IMAGE, 'subDir' => 'post' // can be page, article, catalog e.t.c... ]);
配置上传组件
BaseUploadComponent中的基本属性
注意: BaseUploadComponent - 基础类,LocalUploadComponent和S3UploadComponent都继承自它。
要了解配置基本属性的原则,请查看components\BaseUploadComponent
类中的公共属性。但配置thumbsConfig
和thumbFilenameTemplate
可能有些困难。属性thumbsConfig
的值遵循以下链
- 来自模块中的默认配置文件
config/thumbs-config.php
的init()
函数。 - 可以在模块中的
thumbsConfig
属性中自定义重写。 - 之前的配置结果被插入到
LocalUploadComponent
和S3UploadComponent
模块组件中。 - 在模块组件中配置的
thumbsConfig
可以在组件的thumbsConfig
属性中自定义重写。
LocalUploadComponent中的属性
这非常简单。请查看components\LocalUploadComponent
类中的公共属性。
S3UploadComponent中的属性
请查看components\S3UploadComponent
类中的公共属性。但有一些重要的属性
-
credentials
- 用于访问亚马逊云服务账户的属性。可以是数组、可调用函数等。请参阅https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html。 -
s3DefaultBucket
- 默认上传文件的存储桶。 -
s3Buckets
- 根据所有者上传文件的存储桶。不是必需的。配置示例
's3Buckets' => [ 'post' => 'bucketWithPosts', 'page' => 'bucketWithPages', 'imageAlbum' => 'bucketWithImages', 'audioAlbum' => 'bucketWithAudio', ]
有关S3配置的更多信息,请参阅以下链接
- https://docs.aws.amazon.com/aws-sdk-php/v3/guide/index.html
- https://docs.aws.amazon.com/aws-sdk-php/v3/api
- https://github.com/aws/aws-sdk-php
链接所有者和实体
要将实体(媒体文件和专辑)与所有者(页面、文章、帖子等)关联,有一个抽象类behaviors\Behavior
。
必须使用子类:behaviors\BehaviorMediafile
和behaviors\BehaviorAlbum
。
以下是一个示例说明。
你有一个扩展ActiveRecord yii2类的catalog
模型。
在catalog
模型的behaviors
中,使用behaviors\BehaviorMediafile
和behaviors\BehaviorAlbum
将媒体文件和专辑与目录关联,在插入新目录数据到数据库后:在insert active record
、update active record
、delete active record
时。
use Itstructure\MFUploader\behaviors\{BehaviorMediafile, BehaviorAlbum}; use Itstructure\MFUploader\interfaces\UploadModelInterface; use Itstructure\MFUploader\models\album\Album;
public $thumbnail; public $imageAlbum = []; public function behaviors() { return ArrayHelper::merge(parent::behaviors(), [ 'mediafile' => [ 'class' => BehaviorMediafile::class, 'name' => static::tableName(), 'attributes' => [ UploadModelInterface::FILE_TYPE_THUMB, ], ], 'albums' => [ 'class' => BehaviorAlbum::class, 'name' => static::tableName(), 'attributes' => [ Album::ALBUM_TYPE_IMAGE, ], ], ]); }
注意:应与视图表单模板中的FileSetter
小部件一起使用此块!
以下是发生的情况
- 如果你在FileSetter小部件中使用“缩略图”名称为
attribute
的参数,则上传的媒体文件(缩略图)将在将新目录数据插入数据库后与catalog
关联。 - 如果你使用“imageAlbum”(通过Album::ALBUM_TYPE_IMAGE)名称作为下拉列表或复选框HTML字段的
name
属性,则最后创建的图像专辑将在将新目录数据插入数据库后与catalog
关联。
这与以下数据库示例结构相符
mediafiles
表 - 现已插入id=20的记录。
| id | ... | created_at | updated_at |
|-----|-----|---------------------|---------------------|
| ... | ... | ... | ... |
| 20 | ... | 2018-05-06 21:35:04 | 2018-05-06 21:35:10 |
catalog
表 - 在创建媒体文件(id=20)后插入id=10的记录。
| id | ... | created_at | updated_at |
|-----|-----|---------------------|---------------------|
| ... | ... | ... | ... |
| 10 | ... | 2018-05-06 21:35:20 | 2018-05-06 21:35:25 |
owners_mediafiles表
| mediafileId | ownerId | owner | ownerAttribute |
|-------------|---------|-----------|------------------|
| ... | ... | ... | ... |
| 20 | 10 | catalog | thumbnail |
albums表
| id | type | ... | created_at | updated_at |
|-----|-------------|-----|---------------------|---------------------|
| ... | ... | ... | ... | ... |
| 5 | imageAlbum | ... | 2018-05-06 21:30:00 | 2018-05-06 21:30:05 |
owners_albums表
| albumId | ownerId | owner | ownerAttribute |
|---------|---------|-----------|------------------|
| ... | ... | ... | ... |
| 5 | 10 | catalog | imageAlbum |
注意:如果在FileSetter小部件中设置了属性:owner
、ownerId
、ownerAttribute
,则在uploadmanager
中的ajax请求期间将自动执行实体与所有者的链接。
集成专辑控制器
在命名空间Itstructure\MFUploader\controllers\album
中已经集成了专辑控制器。这些控制器提供与以下类型专辑的工作:图像专辑、音频专辑、视频专辑、应用程序专辑、文本专辑和其他专辑。
已经为这些控制器提供了模型和视图模板。
要使用这些控制器,只需在应用程序配置中设置路由即可。
许可证
版权所有 © 2018-2023 安德烈·格里尼克 girnikandrey@gmail.com。
许可协议遵循MIT许可证。详细信息请参阅LICENSE.txt文件。