ptheofan / yii2-file-upload-behavior
一个高度可定制的系统,使文件上传管理变得尽可能简单。
v1.0.11
2022-01-29 17:48 UTC
Requires
- php: >=7.4.0
- ext-fileinfo: *
- ptheofan/yii2-file-helper: ^1.0
- ptheofan/yii2-image-helper: ^1.0
- yiisoft/yii2: ^2.0
Suggests
- creocoder/yii2-flysystem: Required if you use the build-in FlySystem storage manager fascade
- yiisoft/yii2-imagine: Required for the built-in image uploads versioning
README
文档尚不完整,将在时间允许的情况下添加更多信息。如果您想询问或添加文档中的内容,请随时提交问题。目前仅包含FlySystem的代理。在适当的时候,我还会添加基本本地文件系统的代理。
整个系统设计得非常可定制和可扩展。有几个点可以进行(并将进行)改进,以使其尽可能可扩展和可定制,同时保持其合理性。
以下是一个配置行为并使用它允许用户上传他们的头像的示例。在这个例子中,我们希望实现以下目标
- 以
avatar
的方式访问属性- 查看
modelVirtualAttribute
- 查看
- 将文件名存储到数据库的
avatar_hash
列中。- 查看
modelAttribute
- 查看
- 文件名以行ID为前缀,文件名为文件的SHA1,后缀为版本
- 为此,我们将
filenameGenerator
设置为使用CallbackFilenameGenerator
- 配置它不包括扩展名(在这种情况下,版本将负责 .ext)
- 为此,我们将
- 保留以下版本
- 未调整大小的PNG格式上传
PngBaseVersion
。最终名称将类似于 512-deadbeef.png - sm(宽度 = 64像素)后缀
-sm
。最终名称将类似于 512-deadbeef-sm.png - md(宽度 = 256像素)后缀
-md
。最终名称将类似于 512-deadbeef-md.png - lg(宽度 = 512像素)后缀
-lg
。最终名称将类似于 512-deadbeef-lg.png
- 未调整大小的PNG格式上传
当请求到达时,只需将 UploadedFile
实例推送到 avatar
模型属性,保存模型,然后就可以看到图像已按照提供的配置存储,并且生成了所有版本。
$model->avatar = UploadedFile::getInstance($model, 'file'); $model->save();
当您想检索上传文件的特定版本时,只需调用
$url = $model->avatar->getVersion('sm')->getUrl();
您还可以打印对象以获取详细的帮助信息
echo $model->avatar;
在以下示例中,我们配置我们的模型使用数据库列 avatar_hash
在数据库中存储文件信息,并将虚拟属性设置为头像。这意味着
$model->avatar_hash
包含由生成器产生的值(通常您不需要触摸此列)。$model->avatar
是您访问图像的访问器。调用$model->avatar->getVersion('sm')->getUrl()
将返回文件的完整小版本URL。- 您可以将上传的文件分配得像这样简单:
$model->avatar = UploadedFile::getInstance($model, 'avatar')
- 您可以将base64编码的图像分配得像这样简单:
$model->avatar = $myBase64EncodedImage
- 您可以通过以下方式推送二进制字符串:
$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', ], ], ], ]; } ```