$6.95+
Add to cart

Yii2 Storage

Yii2 Storage

  

A complete extension for file storage management in Yii2 that supports multiple cloud and local storage providers.

Features

  • ✅ Multiple providers: Amazon S3, Azure Blob Storage, Google Cloud Storage and local storage
  • ✅ File validation: Control of allowed file extensions and types
  • ✅ Flexible configuration: Support for path prefixes and custom configurations
  • ✅ Easy integration: Compatible with Yii2 forms and models
  • ✅ URL management: Automatic generation of public URLs for files

Tags: #storage #component #upload #file #extension #aws #azure #google #yii2

Demo. File upload form is in the index.

Installation

This extension is distributed as a ZIP file that must be manually extracted.

This documentation asumes the user is familiar with AWS S3, Azure Blob Storage and/or Google Cloud Storage service(s).

Installation steps:

  1. Download the yii2-storage component ZIP file
  2. Extract to a directory of your choice within the project:
    components/neoacevedo/yii2-storage/
    
  3. Configure repository in your composer.json project:
    "repositories": [
         {
             "type": "composer",
             "url": "https://asset-packagist.org"
         },
     	{
             "type": "path",
             "name": "neoacevedo/yii2-storage",
             "url": "components/neoacevedo/yii2-storage"
         }
     ]
    
  4. Regenerate autoloader:
    • Option 1: Direct installation
composer require neoacevedo/yii2-storage
  • Option 2: Add to the require section of your composer.json project
{
    "require": {
        "neoacevedo/yii2-storage": "dev-main"
    }
}

Then run:

composer update

Configuration

Once the extension is installed, configure the storage component in your Yii2 application configuration file (config/web.php or common/config/main.php):

Amazon S3

'components' => [
    'storage' => [
        'class' => 'neoacevedo\yii2\storage\S3Storage',
        'accessKey' => 'YOUR_IAM_ACCESS_KEY',
        'secretAccessKey' => 'YOUR_IAM_SECRET_ACCESS_KEY',
        'bucket' => 'your-bucket-name',
        'region' => 'us-east-1', // AWS Region
        'directory' => 'uploads/', // Directory within the bucket (optional)
        'acl' => 'public-read', // File ACL (optional)
        'storageClass' => 'STANDARD', // Storage class (optional)
        'presignedUrl' => true, // Signed URLs (optional)
        'presignedUrlExpiration' => '+1 hour', // Expiration time (optional)
        'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx'
    ],
],

Azure Blob Storage

'components' => [
    'storage' => [
        'class' => 'neoacevedo\yii2\storage\AzureBlobStorage',
        'accountName' => 'YOUR_STORAGE_ACCOUNT_NAME',
        'accountKey' => 'YOUR_STORAGE_ACCOUNT_KEY',
        'container' => 'your-container-name',
        'directory' => 'uploads/', // Directory within the container (optional)
        'cdn' => 'https://your-cdn.azureedge.net', // CDN URL (optional)
        'hierarchicalNamespace' => false, // true for Data Lake Gen2 (optional)
        'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx'
    ],
],

Google Cloud Storage

'components' => [
    'storage' => [
        'class' => 'neoacevedo\yii2\storage\GoogleCloudStorage',
        'projectId' => 'YOUR_PROJECT_ID',
        'bucket' => 'your-bucket-name',
        'keyFileContent' => file_get_contents('/path/to/service-account-key.json'), // JSON file content
        'directory' => 'uploads/', // Directory within the bucket (optional)
        'cdn' => 'https://your-cdn.googleusercontent.com', // CDN URL (optional)
        'presignedUrl' => true, // Signed URLs (optional)
        'presignedUrlExpiration' => 3600, // Expiration time in seconds (optional)
        'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx'
    ],
],

Local Storage

'components' => [
    'storage' => [
        'class' => 'neoacevedo\yii2\storage\LocalStorage',
        'directory' => '@webroot/uploads/', // Physical storage directory
        'cdn' => 'https://your-cdn.com', // CDN URL (optional)
        'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp,doc,docx,xls,xlsx'
    ],
],

Usage

Basic Usage with Component

<?php
// In your controller
use yii\web\UploadedFile;

public function actionUpload()
{
    $fileManager = Yii::$app->storage->getFileManager();
    
    if (Yii::$app->request->isPost) {
        $fileManager->uploadedFile = UploadedFile::getInstance($fileManager, 'uploadedFile');
        
        if ($fileManager->validate() && Yii::$app->storage->save($fileManager)) {
            // File uploaded successfully
            $fileUrl = Yii::$app->storage->getUrl($fileManager->fileName);
            Yii::$app->session->setFlash('success', 'File uploaded successfully: ' . $fileUrl);
        } else {
            Yii::$app->session->setFlash('error', 'Error uploading file.');
        }
    }
    
    return $this->render('upload', ['fileManager' => $fileManager]);
}

Direct Usage without Component

<?php
use neoacevedo\yii2\storage\S3Storage;
use yii\web\UploadedFile;

public function actionUpload()
{
    $storage = new S3Storage([
        'accessKey' => 'YOUR_IAM_ACCESS_KEY',
        'secretAccessKey' => 'YOUR_IAM_SECRET_ACCESS_KEY',
        'bucket' => 'your-bucket-name',
        'region' => 'us-east-1',
        'directory' => 'uploads/',
        'allowedExtensions' => 'pdf,jpg,jpeg,gif,png,bmp'
    ]);
    
    $fileManager = $storage->getFileManager();
    $fileManager->uploadedFile = UploadedFile::getInstance($fileManager, 'uploadedFile');
    
    if ($storage->save($fileManager)) {
        return $storage->getUrl($fileManager->fileName);
    }
    
    return false;
}

Form Integration

In the Controller:

public function actionCreate()
{
    $model = new YourModel();
    $fileManager = Yii::$app->storage->getFileManager();
    
    if ($model->load(Yii::$app->request->post())) {
        $fileManager->uploadedFile = UploadedFile::getInstance($fileManager, 'uploadedFile');
        
        if ($fileManager->validate() && Yii::$app->storage->save($fileManager)) {
            $model->file_path = $fileManager->fileName;
            if ($model->save()) {
                return $this->redirect(['view', 'id' => $model->id]);
            }
        }
    }
    
    return $this->render('create', [
        'model' => $model,
        'fileManager' => $fileManager
    ]);
}

In the View:

<?php
use yii\widgets\ActiveForm;

$form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]);
?>

<?= $form->field($model, 'name')->textInput() ?>

<?= $form->field($fileManager, 'uploadedFile')->fileInput([
    'accept' => 'image/*,.pdf,.doc,.docx',
    'class' => 'form-control'
]) ?>

<div class="form-group">
    <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
</div>

<?php ActiveForm::end(); ?>

Available Methods

// Get file manager
$fileManager = Yii::$app->storage->getFileManager();

// Save file
$success = Yii::$app->storage->save($fileManager);

// Get file URL
$url = Yii::$app->storage->getUrl('filename.jpg');

// Delete file
$deleted = Yii::$app->storage->delete('filename.jpg');

// List of files/directories in the bucket. Optional: directory name ending with '/' to list its contents.
$files = Yii::$app->storage->list();

Advanced Configuration Examples

Multiple Configuration

'components' => [
    'storageImages' => [
        'class' => 'neoacevedo\yii2\storage\S3Storage',
        'accessKey' => 'YOUR_ACCESS_KEY',
        'secretAccessKey' => 'YOUR_SECRET_KEY',
        'bucket' => 'images-bucket',
        'region' => 'us-east-1',
        'directory' => 'images/',
        'allowedExtensions' => 'jpg,jpeg,gif,png,bmp'
    ],
    'storageDocuments' => [
        'class' => 'neoacevedo\yii2\storage\S3Storage',
        'accessKey' => 'YOUR_ACCESS_KEY',
        'secretAccessKey' => 'YOUR_SECRET_KEY',
        'bucket' => 'documents-bucket',
        'region' => 'us-east-1',
        'directory' => 'documents/',
        'allowedExtensions' => 'pdf,doc,docx,xls,xlsx'
    ],
],

License

This project is licensed under the GPLv3 License. See LICENSE file for more details.

Support

If you encounter any issues or have questions, please send an email to contacto@neoacevedo.nom.co.

$
Add to cart
Unlimited Sites/Projects
Size
44 KB
Powered by