storage-manager An extension to handle large file libraries

  1. Links
  2. Requirements & Dependency
  3. Installation
  4. Usage

This extension brings functionality to upload and store large amount of files and thumbnail creation for images. First of all, it's not an Yii2 extension because it has no Yii2 dependency, but it's works with Yii2 either.


Requirements & Dependency

The library has the following requirements:

  • PHP 5.6+
  • The library has a single dependency - Imagine. This only needed if you what to make thumbnails with storage-manager.


The preferred way to install this library is through composer.

Either run ~~~ php composer.phar require --prefer-dist x000000/storage-manager ~~~ or add ~~~ "x000000/storage-manager": "^0.3" ~~~

to the require section of your composer.json.



First of all you need to add a component to your config like this:

'storage' => function() {
    return new \x000000\StorageManager\Storage(
        // this is a full path to the directory where files will be stored in
        // this is a url to the directory above (how directory will be available by HTTP)

Now we need to store some files there.

We can make it either with $storage->processFile() and passing full path to the file we want to store:

$storage = \Yii::$app->storage;
$image   = $storage->processFile('/full/path/to/image.png');

or if you want to process newly uploaded file you can use $storage->processUploadedFile() and passing an item from $_FILES array:

$image = $storage->processUploadedFile($_FILES['your_file_key']);

Now if everything is fine we have $image stored in $baseDir and renamed with it md5 content accordingly. For example it could be something like aed0d71a5adaff3a43b75fb4ccc7ff48.png. Yes, we've lost it original name, but we do not store duplicates either.

After successful storing file on your physical disk, you may want to save it to the database too. And you do not have to save a full path to the file, you may save only a file name - $image.


Now you may want to display an $image or just share a link to it: ~~~ [html] <?= $storage->getSource($image); ?>$storage->getSource() we can get a full url (domain not included) to the source file (not only images).


There are use-cases when you do not want to display an original $image. Or you want to display a nice square thumbnail (hello Instagram). Or just resized/watermarked $image.

To make it possible there is a helper method $storage->thumb():

This $image resized to fit 300 width
<img src="<?= $storage->thumb($image)->resize(300, null); ?>" />

This $image resized to fit 600 height
<img src="<?= $storage->thumb($image)->resize(null, 600); ?>" />

This $image resized to fit 300x600 pixels size
<img src="<?= $storage->thumb($image)->resize(300, 600); ?>" />

This $image resized by the half with saving original aspect ratio
<img src="<?= $storage->thumb($image)->resize('50%', null); ?>" />

This $image cropped with a rectangle sized 50% x 60% from original image with center in 20x30 on original image
<img src="<?= $storage->thumb($image)->crop(20, 30, '50%', '60%'); ?>" />

This $image cropped with a square with a side size of a lowest $image side.
This is Instagram-ish square crop.
<img src="<?= $storage->thumb($image)->crop('50%', '50%', '100%', '100%', Crop::COVER); ?>" />

This $image cropped with a square with a side size of a greatest $image side.
This is Instagram-ish square crop either, but it adds padding instead of cropping the original.
<img src="<?= $storage->thumb($image)->crop('50%', '50%', '100%', '100%', Crop::CONTAIN); ?>" />

This $image cropped with a rectangle with aspect ratio 16:9.
<img src="<?= $storage->thumb($image)->crop('50%', '50%', '100%', null, 16/9); ?>" />

And of course you can chain resize, crop etc...
<img src="<?= $storage->thumb($image)
    ->crop('50%', '50%', '100%', '100%', Crop::COVER)
    ->resize(300, null); ?>" />

If you do not chain any transform url to the source file will be returned:
<img src="<?= $storage->thumb($image); ?>" />
equals to
<img src="<?= $storage->getSource($image); ?>" />

For now, there are only resize and crop supported, but you can use your own image transforms. For more info see Transform::add().

1 0
Yii Version: 2.0
License: MIT
Category: File System
Developed by: x000000
Created on: Jul 24, 2016
Last updated: 7 years ago


show all

Related Extensions