ptheofan/yii2-file-upload-behavior

一个高度可定制的系统,使文件上传管理变得尽可能简单。

安装: 49

依赖关系: 0

建议者: 3

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

v1.0.11 2022-01-29 17:48 UTC

This package is auto-updated.

Last update: 2024-08-29 05:43:44 UTC


README

文档尚不完整,将在时间允许的情况下添加更多信息。如果您想询问或添加文档中的内容,请随时提交问题。目前仅包含FlySystem的代理。在适当的时候,我还会添加基本本地文件系统的代理。

整个系统设计得非常可定制和可扩展。有几个点可以进行(并将进行)改进,以使其尽可能可扩展和可定制,同时保持其合理性。

以下是一个配置行为并使用它允许用户上传他们的头像的示例。在这个例子中,我们希望实现以下目标

  1. avatar 的方式访问属性
    1. 查看 modelVirtualAttribute
  2. 将文件名存储到数据库的 avatar_hash 列中。
    1. 查看 modelAttribute
  3. 文件名以行ID为前缀,文件名为文件的SHA1,后缀为版本
    1. 为此,我们将 filenameGenerator 设置为使用 CallbackFilenameGenerator
    2. 配置它不包括扩展名(在这种情况下,版本将负责 .ext)
  4. 保留以下版本
    1. 未调整大小的PNG格式上传 PngBaseVersion。最终名称将类似于 512-deadbeef.png
    2. sm(宽度 = 64像素)后缀 -sm。最终名称将类似于 512-deadbeef-sm.png
    3. md(宽度 = 256像素)后缀 -md。最终名称将类似于 512-deadbeef-md.png
    4. lg(宽度 = 512像素)后缀 -lg。最终名称将类似于 512-deadbeef-lg.png

当请求到达时,只需将 UploadedFile 实例推送到 avatar 模型属性,保存模型,然后就可以看到图像已按照提供的配置存储,并且生成了所有版本。

$model->avatar = UploadedFile::getInstance($model, 'file');
$model->save();

当您想检索上传文件的特定版本时,只需调用

$url = $model->avatar->getVersion('sm')->getUrl();

您还可以打印对象以获取详细的帮助信息

echo $model->avatar;

在以下示例中,我们配置我们的模型使用数据库列 avatar_hash 在数据库中存储文件信息,并将虚拟属性设置为头像。这意味着

  1. $model->avatar_hash 包含由生成器产生的值(通常您不需要触摸此列)。
  2. $model->avatar 是您访问图像的访问器。调用 $model->avatar->getVersion('sm')->getUrl() 将返回文件的完整小版本URL。
  3. 您可以将上传的文件分配得像这样简单:$model->avatar = UploadedFile::getInstance($model, 'avatar')
  4. 您可以将base64编码的图像分配得像这样简单:$model->avatar = $myBase64EncodedImage
  5. 您可以通过以下方式推送二进制字符串:$model->avatar = file_get_contents('my_file.png')
public function behaviors(): array
    {
        return [
            'avatar' => [
                'class' => FileAttribute::class,
                'modelAttribute' => 'avatar_hash',
                'modelVirtualAttribute' => 'avatar',
                'generateAfterInsert' => true,
                'filenameGenerator' => [
                    'class' => CallbackFilenameGenerator::class,
                    'withExt' => false,
                    'callback' => static function(string $file, ActiveRecord $model, IFileAttribute $attr) {
                        return sprintf('%s-%s', $model->id, sha1_file($file));
                    }
                ],
                'versions' => [
                    [
                        // will produce 
                        'class' => PngBaseVersion::class,
                        'name' => 'sm',
                        'basePath' => '/avatars',
                        'baseUrl' => 'https://cdn.example.com/avatars',
                        'width' => 64,
                        'suffix' => '-sm',
                    ],
                    [
                        'class' => PngResizedVersion::class,
                        'name' => 'sm',
                        'basePath' => '/avatars',
                        'baseUrl' => 'https://cdn.example.com/avatars',
                        'width' => 64,
                        'suffix' => '-sm',
                    ],
                    [
                        'class' => PngResizedVersion::class,
                        'name' => 'md',
                        'basePath' => '/avatars',
                        'baseUrl' => 'https://cdn.example.com/avatars',
                        'width' => 256,
                        'suffix' => '-md',
                    ],
                    [
                        'class' => PngResizedVersion::class,
                        'name' => 'lg',
                        'basePath' => '/avatars',
                        'baseUrl' => 'https://cdn.example.com/avatars',
                        'width' => 512,
                        'suffix' => '-lg',
                    ],
                ],
            ],
        ];
    }
    ```