All Projects → yii-starter-kit → Yii2 File Kit

yii-starter-kit / Yii2 File Kit

Yii2 File storage and upload kit

Projects that are alternatives of or similar to Yii2 File Kit

Elsa Core
A .NET Standard 2.0 Workflows Library
Stars: ✭ 2,793 (+1762%)
Mutual labels:  hacktoberfest
Poddr
Podcatcher made with Electron and Angular
Stars: ✭ 149 (-0.67%)
Mutual labels:  hacktoberfest
Notifme Sdk
A Node.js library to send all kinds of transactional notifications.
Stars: ✭ 1,854 (+1136%)
Mutual labels:  hacktoberfest
Configurate
A simple configuration library for Java applications providing a node structure, a variety of formats, and tools for transformation
Stars: ✭ 148 (-1.33%)
Mutual labels:  hacktoberfest
Bull
BULL - Bean Utils Light Library
Stars: ✭ 150 (+0%)
Mutual labels:  hacktoberfest
Zeebe
Distributed Workflow Engine for Microservices Orchestration
Stars: ✭ 2,165 (+1343.33%)
Mutual labels:  hacktoberfest
Bull exporter
Prometheus exporter for Bull metrics
Stars: ✭ 149 (-0.67%)
Mutual labels:  hacktoberfest
Cnpj Gratis
Com esse pacote você poderá consultar, gratuitamente, CNPJ diretamente no site da receita
Stars: ✭ 150 (+0%)
Mutual labels:  hacktoberfest
Generator Spfx
Open-source generator to extend the capabilities of the Microsoft SPFx generator
Stars: ✭ 150 (+0%)
Mutual labels:  hacktoberfest
Rpush
The push notification service for Ruby.
Stars: ✭ 1,886 (+1157.33%)
Mutual labels:  hacktoberfest
Geshi 1.0
Original version of Generic Syntax Highlighter for PHP
Stars: ✭ 149 (-0.67%)
Mutual labels:  hacktoberfest
Strapi Middleware Cache
🔌 A cache middleware for https://strapi.io
Stars: ✭ 146 (-2.67%)
Mutual labels:  hacktoberfest
Core
The server component of API Platform: hypermedia and GraphQL APIs in minutes
Stars: ✭ 2,004 (+1236%)
Mutual labels:  hacktoberfest
Container
HedgeDoc container image resources
Stars: ✭ 149 (-0.67%)
Mutual labels:  hacktoberfest
Sympa
Sympa, Mailing List Management Software
Stars: ✭ 149 (-0.67%)
Mutual labels:  hacktoberfest
Easyengine
Command-line control panel for Nginx Server to manage WordPress sites running on Nginx, PHP, MySQL, and Let's Encrypt
Stars: ✭ 1,881 (+1154%)
Mutual labels:  hacktoberfest
Vue Axios
A small wrapper for integrating axios to Vuejs
Stars: ✭ 1,887 (+1158%)
Mutual labels:  hacktoberfest
Pos
Stars: ✭ 150 (+0%)
Mutual labels:  hacktoberfest
Portofino
Portofino 5 is the next generation of the open source radid web development framework Portofino. Its purpose is to help developers create modern, responsive enterprise applications with REST APIs and an Angular UI.
Stars: ✭ 150 (+0%)
Mutual labels:  hacktoberfest
Stryker Js
Mutation testing for JavaScript and friends
Stars: ✭ 2,043 (+1262%)
Mutual labels:  hacktoberfest

GitHub Workflow Status Packagist Version (custom server) Packagist

This kit is designed to automate routine processes of uploading files, their saving and storage. 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

Here you can see list of available filesystem adapters

Demo

Since file kit is a part of yii2-starter-kit it's demo can be found in starter kit demo here.

Installation

The preferred way to install this extension is through composer.

Either run

php composer.phar require yii2-starter-kit/yii2-file-kit

or add

"yii2-starter-kit/yii2-file-kit": "@stable"

to the require section of your composer.json file.

File Storage

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.
'fileStorage'=>[
    'class' => 'trntv\filekit\Storage',
    'useDirindex' => true,
    'baseUrl' => '@web/uploads'
    'filesystem'=> ...
        // OR
    'filesystemComponent' => ...
],

There are several ways to configure trntv\filekit\Storage to work with flysystem.

Using Closure

'fileStorage'=>[
    ...
    'filesystem'=> function() {
        $adapter = new \League\Flysystem\Adapter\Local('some/path/to/storage');
        return new League\Flysystem\Filesystem($adapter);
    }
]

Using filesystem builder

  • Create a builder class that implements trntv\filekit\filesystem\FilesystemBuilderInterface and implement method build which returns filesystem object. See examples/
  • Add to your configuration:
'fileStorage'=>[
    ...
    'filesystem'=> [
        'class' => 'app\components\FilesystemBuilder',
        'path' => '@webroot/uploads'
        ...
    ]
]

Read more about flysystem at http://flysystem.thephpleague.com/

Using third-party extensions

  • Create filesystem component (example uses creocoder/yii2-flysystem)
'components' => [
    ...
    'fs' => [
        'class' => 'creocoder\flysystem\LocalFilesystem',
        'path' => '@webroot/files'
    ],
    ...
]
  • Set filesystem component name in storage configuration:
'components' => [
    ...
    'fileStorage'=>[
        'filesystemComponent'=> 'fs'
    ],
    ...
]

Actions

File Kit contains several Actions to work with uploads.

Upload Action

Designed to save the file uploaded by the widget

public function actions(){
    return [
           'upload'=>[
               'class'=>'trntv\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

Delete Action

public function actions(){
    return [
       'delete'=>[
           'class'=>'trntv\filekit\actions\DeleteAction',
           //'fileStorage' => 'fileStorageMy', // my custom fileStorage from configuration(such as in the upload action)
       ]
    ];
}

See additional settings in the corresponding class

View (Download) Action

public function actions(){
    return [
       'view'=>[
           'class'=>'trntv\filekit\actions\ViewAction',
       ]
    ];
}

See additional settings in the corresponding class

Upload Widget

Standalone usage

echo \trntv\filekit\widget\Upload::widget([
    'model' => $model,
    'attribute' => 'files',
    'url' => ['upload'],
    'uploadPath' => 'subfolder', // optional, for storing files in storage subfolder
    'sortable' => true,
    'maxFileSize' => 10 * 1024 * 1024, // 10Mb
    'minFileSize' => 1 * 1024 * 1024, // 1Mb
    'maxNumberOfFiles' => 3, // default 1,
    'acceptFileTypes' => new \yii\web\JsExpression('/(\.|\/)(gif|jpe?g|png)$/i'),
    'showPreviewFilename' => false,
    'editFilename' => false,
    'clientOptions' => [/* ...other blueimp options... */]
]);

Standalone usage - without model

echo \trntv\filekit\widget\Upload::widget([
    'name' => 'filename',
    'hiddenInputId' => 'filename', // must for not use model
    'url' => ['upload'],
    'uploadPath' => 'subfolder', // optional, for storing files in storage subfolder
    'sortable' => true,
    'maxFileSize' => 10 * 1024 * 1024, // 10Mb
    'minFileSize' => 1 * 1024 * 1024, // 1Mb
    'maxNumberOfFiles' => 3, // default 1,
    'acceptFileTypes' => new \yii\web\JsExpression('/(\.|\/)(gif|jpe?g|png)$/i'),
    'showPreviewFilename' => false,
    'editFilename' => false,
    'clientOptions' => [/* ...other blueimp options... */]
]);

With ActiveForm

echo $form->field($model, 'files')->widget(
    '\trntv\filekit\widget\Upload',
    [
        'url' => ['upload'],
        'uploadPath' => 'subfolder', // optional, for storing files in storage subfolder
        'sortable' => true,
        'maxFileSize' => 10 * 1024 * 1024, // 10 MiB
        'maxNumberOfFiles' => 3,
        'clientOptions' => [/* ...other blueimp options... */]
    ]
);

Upload Widget events

Upload widget trigger some of built-in blueimp events:

  • start
  • fail
  • done
  • always

You can use them directly or add your custom handlers in options:

'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 ... }'),
 ]

UploadBehavior

This behavior is designed to save uploaded files in the corresponding relation.

Somewhere in model:

For multiple files

 public function behaviors()
 {
    return [
        'file' => [
            'class' => 'trntv\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

 public function behaviors()
 {
     return [
          'file' => [
              'class' => 'trntv\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.

Validation

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.

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

Tips

Adding watermark

Install intervention/image library

composer require intervention/image

Edit your upload actions as so

public function actions(){
    return [
           'upload'=>[
               'class'=>'trntv\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());
               }
               ...
           ]
       ];
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].