oleg-chulakov-studio/yii2-filestorage
Composer 安装命令:
composer require oleg-chulakov-studio/yii2-filestorage
包简介
Upload and storage files.
README 文档
README
Компонент позволяющий загружать и хранить файлы, генерировать thumbnails изображений.
Возможности компонента:
resizeизображения- конвертирование в разные расширения
- наложение водяных меток
- генерирование изображений:
thumbnails,cover,contain,widen,heightenот оригинального файла с различными настройками
На данной странице описано базовое использование и базовые настройки данного компонента. Остальное можно прочитать в следующих разделах:
Установка
Чтобы установить компонент, нужно в composer.json добавить следующие строки:
"require": {
"oleg-chulakov-studio/yii2-filestorage": "~1.0.11"
}
Или набрать команду:
composer require oleg-chulakov-studio/yii2-filestorage
Настройка
1) Выполнить миграции
Для выполнения миграции нужно вызвать следующую команду из корня приложения:
php yii migrate/up --migrationPath=@vendor/oleg-chulakov-studio/yii2-filestorage/src/migrations
При выполнении миграции будет создана таблица file со следующим содержимым:
+---------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| group_code | varchar(16) | NO | MUL | NULL | |
| object_id | int(11) | YES | MUL | NULL | |
| object_type | varchar(16) | YES | | NULL | |
| ori_name | varchar(255) | NO | | NULL | |
| ori_extension | varchar(16) | NO | | NULL | |
| sys_file | varchar(255) | NO | UNI | NULL | |
| mime | varchar(255) | NO | | NULL | |
| size | int(11) unsigned | NO | | 0 | |
| created_at | int(11) | NO | | NULL | |
| updated_at | int(11) | NO | | NULL | |
+---------------+------------------+------+-----+---------+----------------+
, где
group_code- код группыobject_id- ID прикрепленного объектаobject_type- Тип прикрепленного объектаori_name- оригинальное название файлаori_extension- оригинальное расширение файлаsys_file- системное название файлаmime- mime тип файлаsize- размер файлаcreated_at- дата создания файлаupdated_at- дата обновления файла
2) Подключение компонента хранилища
В config/main.php нужно настроить компоненты:
'fileStorage' => [ 'class' => \chulakov\filestorage\FileStorage::class, 'storageBaseUrl' => false, // Базовый url 'storagePath' => '@webroot', // Путь сохранения 'storageDir' => 'uploaded', // Папка с сохраняемыми файлами 'fileMode' => 0755, // Уровень доступа к сохраняемым файлам 'storagePattern' => '{group}/{id}', // Корневой шаблон генерации пути сохранения файлов ], 'imageComponent' => [ 'class' => \chulakov\filestorage\ImageComponent::class, 'driver' => 'gd', // Базовые драйвера: gd и imagick ]
3) Подключение поведения модели
Система сохранения работает с помощью поведений, они ответственны за доставку файла модели. Данные поведения прикрепляются к моделям, в дальнейшем обрабатывают файл и прикрепляют файл в указанный атрибут модели.
Имеется два загрузочных поведения:
FileUploadBehavior- поведение рассчитано на загрузку одного файлаFilesUploadBehavior- поведение рассчитано на загрузку нескольких файлов.
Подключение поведения:
public function behaviors() { return [ [ 'class' => \chulakov\filestorage\behaviors\FileUploadBehavior::class, // Поведение 'attribute' => 'image', // Атрибут модели 'group' => 'photos', // Сохраняемая группа 'type' => 'detail', // Тип файла в группе объектов 'fileStorage' => 'fileStorage', // Компонент хранения файлов 'repository' => \chulakov\filestorage\uploaders\UploadedFile::class, // Репозиторий ], ]; }
4) Подключение репозиториев
К каждому поведению нужно настроить способ получения файла, а именно - настроить репозиторий.
Доступные репозитории:
UploadedFile- загрузка обычных файлов(через POST запрос)RemoteUploadedFile- загрузка удаленных файлов(через ссылку на файл)LocalUploadedFile- загрузка локального файла (через указание абсолютного пути до файла)
5) Настройка репозиториев
Сам репозиторий основан на шаблоне Observer, то есть он имеет слушателя и наблюдателя:
UploadedFile- наблюдательImageManager- слушатель
В конечном итоге, весь компонент работает на событийной модели обработки и сохранения файлов.
Реализуется такая цепочка:
получаем файл -> срабатывает событие -> производится обработка файла -> сохранение файла.
6) Настройка слушателей
Слушатели подписываются на события наблюдателя, после чего каждый слушатель получает информацию о файле в момент сохранения файла. Каждый слушатель может производить над файлом свои действия, в результате чего производится видоизменение файла и различные побочные действия.
Все слушатели должны реализовывать ListenerInterface, только так они могут подписаться на наблюдателя.
ImageManager
ImageManager работает с только изображениями, производит resize, накладывает watermark,
меняет расширение и т.д. Он имеет следующие настройки:
width- ширина изображенияheight- высота изображенияencode- расширение изображенияquality- качество изображенияwatermark- путь на водяную меткуwatermarkPosition- позиция водяной меткиimageClass- компонент работы с изображениями
ThumbManager
Все параметры по настройки ThumbManager аналогичны ImageManager.
Каждая настройка применяется над файлом, после сохранения все данные настройки
будут отображены на конечном сохраненном файле.
Все сохраненные thumbnail сохраняются в отдельную папку под названием thumbs.
Базовой путь до файлов подвержен структуре формирования пути:
'{relay}/{group}/{basename}/{type}_{width}x{height}.{ext}'
, где:
relay- полныйrootпуть до группыgroup- название сохраняемой группыbasename- базовое имя файлаtype- тип изображения. Есть несколько базовых типов:thumbs,cover,contain,widen,heighten.width- ширинаheight- высотаext- расширение файла
Чтобы повлиять на алгоритм генерации пути, можно прокинуть в imageParamsClass
корректно настроенную параметрическую модель или свою реализацию параметрической модели.
Настройка слушателей
public function behaviors() { return [ [ 'class' => \chulakov\filestorage\behaviors\FileUploadBehavior::class, // подключаемое поведение 'attribute' => 'image', // атрибут, куда будет помещен файл 'group' => 'photos', // группа сохраняемого изображения 'type' => 'detail', // тип сохраняемого изображения в группе 'fileStorage' => 'fileStorage', // компонент хранения 'repository' => \chulakov\filestorage\uploaders\UploadedFile::class, // выбранный загрузчик 'repositoryOptions' => [ // опции репозитория 'listeners' => [ // список слушателей [ 'class' => ThumbsManager::class, // Класс слушателя 'width' => 640, // Ширина 'height' => 480, // Высота 'encode' => 'jpg', // Расширение 'quality' => 100, // Качество в процентах 'watermarkPath' => '/path/to/image/watermark.png', // Наложенная водяная метка 'watermarkPosition' => Position::CENTER, // Позиция водяной метки 'imageComponent' => 'imageComponent', // Имя компонента для работы изображениями ], [ 'class' => ImageManager::class, // Класс слушателя 'width' => 640, // Ширина 'height' => 480, // Высота 'encode' => 'jpg', // Расширение 'quality' => 100, // Качество в процентах 'watermarkPath' => '/path/to/image/watermark.png', // Наложенная водяная метка 'watermarkPosition' => Position::CENTER, // Позиция водяной метки 'imageComponent' => 'imageComponent', // Имя компонента для работы изображениями 'accessRole' => 'role_example', // Роль разрешенная для работы с изображениями ] ], ] ], ]; }
7) Пример реализации контроллера с загрузкой файла
В примере реализации контроллера с загрузкой файла можно увидеть метод использования функционала поведения. В результате чего будет получен и сохранен загружаемый файл.
/** * Загрузка изображения через ajax запрос */ public function actionIndex() { $form = new FileForm(); // Инициализация формы $request = \Yii::$app->request; if ($request->isPost) { $form->load(\Yii::$app->request->post(), ''); // Загрузка параметров if ($form->validate() && $form->upload()) { // Валидация и загрузка файлов return json_encode(['success' => true]); // Выдача сообщения о успешной загрузки } } throw new NotUploadFileException('Файл не был загружен.'); }
8) Валидация обновляемого файла
Когда используется общая форма для добавления и редактирования данных для обхода валидации обязательности загрузки файла при редактировании, можно воспользоваться встроенным файловым валидатором, который воспринимает наличие ранее загруженного файла и игнорирует обязательность ранее загруженного файла.
Подключение валидатора:
public function rules() { return [ ['attachFile', FileValidator::class, 'targetAttribute' => 'attachedFile'], // ['attachFile', FileValidator::class, 'targetAttribute' => 'attachedFile', 'strict' => true], ]; }
Изначально strict, строгая проверка по типу объектов (UploadedInterface - у загружаемого
и BaseFile - у ранее загруженного), отключена, но ее можно легко включить добавив
в правила подключенного валидатора 'strict' => true.
9) Миграции с загрузкой файлов
При разработке проектов порой приходится создавать новые миграции с таблицами
к которым должен быть прикреплен файл. Помимо того, что нужно создать саму таблицу
для удобства загружают сразу исходные изображения, то есть нужно осуществить
загрузку файла прямиком через миграцию. Для решения данной задачи нами был
разработан класс Migration. Для использования необходимо унаследоваться от этого класса.
Непосредственно в миграции появляется дополнительная функция $this->upload();,
данная функция позволяет указать исходный путь к файлу и передать параметры
вроде группы, идентификатора объекта и типа объекта.
public function safeUp() { $params = new UploadParams('group'); $params->object_id = 123; $params->object_type = 'logo'; $this->upload('/path/to/file.png', $params); }
10) Расширение таблицы файла
Если в таблицу к файлу необходимо добавить дополнительные поля, такие как комментарий к каждому файлу, можно смело расширять исходную таблицу и внедрять в нее необходимые поля. Но в силу того, что компонент по умолчанию работает с базовым файлом и знает о модели только те данные, что он может получить из самого файла, то для реализации сохранения расширенных полей можно воспользоваться событием, которое сработает до или после сохранения модели в базу данных и, если это необходимо, указать собственный класс модели файла.
public function behaviors() { return [ [ 'class' => \chulakov\filestorage\behaviors\FileUploadBehavior::class, 'attribute' => 'image', 'group' => 'photos', 'modelClass' => \common\model\MyFileModel::class, 'repositoryOptions' => [ 'events' => [ SaveModelEvent::BEFORE_MODEL_SAVE => [ [$this, 'fillModel'], ], ], ] ], ]; } public function fillModel(SaveModelEvent $event) { /** @var \common\model\MyFileModel $model **/ $model = $event->model; $model->comment = $this->comment; // или более безопасный способ if ($event->model->hasAttribute('comment')) { $event->model->setAttribute('comment', $this->comment); } }
Все остальные примеры можно посмотреть в папке с примерами.
Тестирование
Реализовано базовое unit тестирование.
Чтобы запустить тесты, нужно выполнить данную команду в корне компонента filestorage:
../bin/phpunit
Реализованы следующие тесты:
ObserverTest- тестирование работоспособности событийной системы, а именно слушателя и наблюдателяUploadedFileTest- тестирование репозитория базовой загрузкиRemoteUploadedFileTest- тестирование репозитория удаленной загрузкиImageManagerTest- тестирование менеджера работы с изображениямиThumbManagerTest- тестирование менеджера для генерирования thumbnailImageContainer- тестирование сервиса для работы с изображениямиPathServiceTest- тестирование сервиса для работы с путямиUsageTest- тестирование полной цепочки действий, от начала загрузки до обработки файлов
Также, во время тестирования происходит работа с тестовой базой данных, она
находится в /data/database/test.db.
oleg-chulakov-studio/yii2-filestorage 适用场景与选型建议
oleg-chulakov-studio/yii2-filestorage 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 7.49k 次下载、GitHub Stars 达 6, 最近一次更新时间为 2018 年 04 月 10 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 oleg-chulakov-studio/yii2-filestorage 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 oleg-chulakov-studio/yii2-filestorage 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 7.49k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 6
- 点击次数: 20
- 依赖项目数: 1
- 推荐数: 1
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 2018-04-10