dev-master
9999999-devYii2 file upload delete and storage
BSD-3-Clause
The Requires
- bower-asset/blueimp-file-upload ^9.12.5
- league/flysystem ^1.0
- yiisoft/yii2 ^2.0.9
- yiisoft/yii2-jui ^2.0.0
The Development Requires
by denoll
Yii2 file upload delete and storage
!!! This package creating Eugene Terentev https://github.com/trntv/yii2-file-kit.git. And I do not pretend to any copyrights. This package has been allocated separately only for their own needs !!!, (*2)
This package is designed to automate routine processes of uploading files, their saving and storage., (*3)
It includes: - File upload widget (based on Blueimp File Upload) - Component for storing files (built on top of flysystem) - Actions to download, delete, and view (download) files - Behavior for saving files in the model and delete files when you delete a model, (*4)
Here you can see list of available filesystem adapters, (*5)
Since file kit is a part of yii2-starter-kit it's demo can be found in starter kit demo here., (*6)
The preferred way to install this extension is through composer., (*7)
Either run, (*8)
php composer.phar require denoll/yii2-file-storage
or add, (*9)
"denoll/yii2-file-storage": "@stable"
to the require section of your composer.json
file., (*10)
To work with the File Kit you need to configure FileStorage first. This component is a layer of abstraction over the filesystem - Its main task to take on the generation of a unique name for each file and trigger corresponding events., (*11)
'fileStorage'=>[ 'class' => 'denoll\filekit\Storage', 'baseUrl' => '@web/uploads' 'filesystem'=> ... // OR 'filesystemComponent' => ... ],
There are several ways to configure denoll\filekit\Storage
to work with flysystem
., (*12)
'fileStorage'=>[ ... 'filesystem'=> function() { $adapter = new \League\Flysystem\Adapter\Local('some/path/to/storage'); return new League\Flysystem\Filesystem($adapter); } ]
denoll\filekit\filesystem\FilesystemBuilderInterface
and implement method build
which returns filesystem object. See examples/
'fileStorage'=>[ ... 'filesystem'=> [ 'class' => 'app\components\FilesystemBuilder', 'path' => '@webroot/uploads' ... ] ]
Read more about flysystem at http://flysystem.thephpleague.com/, (*13)
creocoder/yii2-flysystem
)'components' => [ ... 'fs' => [ 'class' => 'creocoder\flysystem\LocalFilesystem', 'path' => '@webroot/files' ], ... ]
'components' => [ ... 'fileStorage'=>[ 'filesystemComponent'=> 'fs' ], ... ]
File Kit contains several Actions to work with uploads., (*14)
Designed to save the file uploaded by the widget, (*15)
public function actions(){ return [ 'upload'=>[ 'class'=>'denoll\filekit\actions\UploadAction', //'deleteRoute' => 'my-custom-delete', // my custom delete action for deleting just uploaded files(not yet saved) //'fileStorage' => 'myfileStorage', // my custom fileStorage from configuration 'multiple' => true, 'disableCsrf' => true, 'responseFormat' => Response::FORMAT_JSON, 'responsePathParam' => 'path', 'responseBaseUrlParam' => 'base_url', 'responseUrlParam' => 'url', 'responseDeleteUrlParam' => 'delete_url', 'responseMimeTypeParam' => 'type', 'responseNameParam' => 'name', 'responseSizeParam' => 'size', 'deleteRoute' => 'delete', 'fileStorage' => 'fileStorage', // Yii::$app->get('fileStorage') 'fileStorageParam' => 'fileStorage', // ?fileStorage=someStorageComponent 'sessionKey' => '_uploadedFiles', 'allowChangeFilestorage' => false, 'validationRules' => [ ... ], 'on afterSave' => function($event) { /* @var $file \League\Flysystem\File */ $file = $event->file // do something (resize, add watermark etc) } ] ]; }
See additional settings in the corresponding class, (*16)
public function actions(){ return [ 'delete'=>[ 'class'=>'denoll\filekit\actions\DeleteAction', //'fileStorage' => 'fileStorageMy', // my custom fileStorage from configuration(such as in the upload action) ] ]; }
See additional settings in the corresponding class, (*17)
public function actions(){ return [ 'view'=>[ 'class'=>'denoll\filekit\actions\ViewAction', ] ]; }
See additional settings in the corresponding class, (*18)
Standalone usage, (*19)
echo \denoll\filekit\widget\Upload::widget([ 'model' => $model, 'attribute' => 'files', 'url' => ['upload'], 'sortable' => true, 'maxFileSize' => 10 * 1024 * 1024, // 10Mb 'minFileSize' => 1 * 1024 * 1024, // 1Mb 'maxNumberOfFiles' => 3 // default 1, 'acceptFileTypes' => new JsExpression('/(\.|\/)(gif|jpe?g|png)$/i'), 'showPreviewFilename' => false, 'clientOptions' => [ ...other blueimp options... ] ]);
With ActiveForm, (*20)
echo $form->field($model, 'files')->widget( '\denoll\filekit\widget\Upload', [ 'url' => ['upload'], 'sortable' => true, 'maxFileSize' => 10 * 1024 * 1024, // 10 MiB 'maxNumberOfFiles' => 3, 'clientOptions' => [ ...other blueimp options... ] ] );
Upload widget trigger some of built-in blueimp events: - start - fail - done - always, (*21)
You can use them directly or add your custom handlers in options:, (*22)
'clientOptions' => [ 'start' => new JsExpression('function(e, data) { ... do something ... }'), 'done' => new JsExpression('function(e, data) { ... do something ... }'), 'fail' => new JsExpression('function(e, data) { ... do something ... }'), 'always' => new JsExpression('function(e, data) { ... do something ... }'), ]
This behavior is designed to save uploaded files in the corresponding relation., (*23)
Somewhere in model:, (*24)
For multiple files, (*25)
public function behaviors() { return [ 'file' => [ 'class' => 'denoll\filekit\behaviors\UploadBehavior', 'filesStorage' => 'myfileStorage', // my custom fileStorage from configuration(for properly remove the file from disk) 'multiple' => true, 'attribute' => 'files', 'uploadRelation' => 'uploadedFiles', 'pathAttribute' => 'path', 'baseUrlAttribute' => 'base_url', 'typeAttribute' => 'type', 'sizeAttribute' => 'size', 'nameAttribute' => 'name', 'orderAttribute' => 'order' ], ]; }
For single file upload, (*26)
public function behaviors() { return [ 'file' => [ 'class' => 'denoll\filekit\behaviors\UploadBehavior', 'filesStorage' => 'fileStorageMy', // my custom fileStorage from configuration(for properly remove the file from disk) 'attribute' => 'file', 'pathAttribute' => 'path', 'baseUrlAttribute' => 'base_url', ... ], ]; }
See additional settings in the corresponding class., (*27)
There are two ways you can perform validation over uploads. On the client side validation is performed by Blueimp File Upload. Here is documentation about available options., (*28)
On the server side validation is performed by [[yii\web\UploadAction]], where you can configure validation rules for [[yii\base\DynamicModel]] that will be used in validation process, (*29)
Install intervention/image
library, (*30)
composer require intervention/image
Edit your upload actions as so, (*31)
public function actions(){ return [ 'upload'=>[ 'class'=>'denoll\filekit\actions\UploadAction', ... 'on afterSave' => function($event) { /* @var $file \League\Flysystem\File */ $file = $event->file; // create new Intervention Image $img = Intervention\Image\ImageManager::make($file->read()); // insert watermark at bottom-right corner with 10px offset $img->insert('public/watermark.png', 'bottom-right', 10, 10); // save image $file->put($img->encode()); } ... ] ]; }
Yii2 file upload delete and storage
BSD-3-Clause