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:
- Download the yii2-storage component ZIP file
-
Extract to a directory of your choice within the project:
components/neoacevedo/yii2-storage/ -
Configure repository in your
composer.jsonproject:"repositories": [ { "type": "composer", "url": "https://asset-packagist.org" }, { "type": "path", "name": "neoacevedo/yii2-storage", "url": "components/neoacevedo/yii2-storage" } ] -
Regenerate autoloader:
- Option 1: Direct installation
composer require neoacevedo/yii2-storage
-
Option 2: Add to the
requiresection 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.