itstructure/yii2-multi-format-uploader

为 Yii2 框架提供的上传文件到本地或 S3 亚马逊存储的模块

3.2.7 2023-01-23 00:04 UTC

This package is auto-updated.

Last update: 2024-09-23 03:19:56 UTC


README

介绍

Latest Stable Version Latest Unstable Version License Total Downloads Build Status Scrutinizer Code Quality

MFUploader -- 用于 Yii2 框架的模块,可以将某些类型的文件上传到本地或 S3 亚马逊存储。MFUploader 模块提供了以下选项

  • 将文件上传到本地存储。
  • 将文件上传到远程亚马逊 S3 存储。
  • 支持文件格式:图像音频视频应用程序文本
  • 将上传的文件与外部应用程序所有者(页面、文章、帖子等)相关联。
  • 管理内部相册:imageAlbumaudioAlbumvideoAlbumapplicationAlbumtextAlbumotherAlbum
  • 将上传的文件与内部相册(所有者)相关联。
  • 将内部相册与外部所有者(页面、文章、帖子等)相关联。

为了处理图像二进制内容,它使用 Yii2 imagine。为了与亚马逊合作,它使用 AWS SDK

以下是基于使用此 MFUploader 模块的基项目示例

yii2-template-multilanguage.

yii2-template-simple.

您可以在我的 个人网站 上查看附加模块描述。

要求

  • 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

    数据库结构

    Data base structure

用法

主要属性

模块的 名称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)。如果我们有 urlmediafiles 表中 \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-components3-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类中的公共属性。但配置thumbsConfigthumbFilenameTemplate可能有些困难。属性thumbsConfig的值遵循以下链

  1. 来自模块中的默认配置文件config/thumbs-config.phpinit()函数。
  2. 可以在模块中的thumbsConfig属性中自定义重写。
  3. 之前的配置结果被插入到LocalUploadComponentS3UploadComponent模块组件中。
  4. 在模块组件中配置的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配置的更多信息,请参阅以下链接

链接所有者和实体

要将实体(媒体文件和专辑)与所有者(页面、文章、帖子等)关联,有一个抽象类behaviors\Behavior

必须使用子类:behaviors\BehaviorMediafilebehaviors\BehaviorAlbum

以下是一个示例说明。

你有一个扩展ActiveRecord yii2类的catalog模型。

catalog模型的behaviors中,使用behaviors\BehaviorMediafilebehaviors\BehaviorAlbum将媒体文件和专辑与目录关联,在插入新目录数据到数据库后:在insert active recordupdate active recorddelete 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小部件中设置了属性:ownerownerIdownerAttribute,则在uploadmanager中的ajax请求期间将自动执行实体与所有者的链接。

集成专辑控制器

在命名空间Itstructure\MFUploader\controllers\album中已经集成了专辑控制器。这些控制器提供与以下类型专辑的工作:图像专辑、音频专辑、视频专辑、应用程序专辑、文本专辑和其他专辑。

已经为这些控制器提供了模型和视图模板。

要使用这些控制器,只需在应用程序配置中设置路由即可。

许可证

版权所有 © 2018-2023 安德烈·格里尼克 girnikandrey@gmail.com

许可协议遵循MIT许可证。详细信息请参阅LICENSE.txt文件。