Comments (2)
А такой вариант не поможет: backend/actions/WswUploadAction.php
Я отнаследовался от экшена и использовал свой экшен в контроллере для определения кто будет загружать картинки. Решились 2 задачи: 1) именование файлов должно быть транслитом и, при этом, с уникальными названиями; 2) пользователи бездумно загружают большие картинки, но есть принцип юзабилити "Не заставляй меня думать" - добавил пропорциональный ресайз с максимальным размером большей стороны 600px (const MAX_SIDE_LENGTH = 600;).
Без ресайза экшен гораздо компактнее :-).
<?php
namespace backend\actions;
use Imagine\Image\Box;
use yii\imagine\Image;
use yii\base\DynamicModel;
use yii\base\Exception;
use yii\web\BadRequestHttpException;
use yii\web\Response;
use yii\web\UploadedFile;
use Yii;
use vova07\imperavi\actions\UploadAction;
use dosamigos\transliterator\TransliteratorHelper;
/**
\* Действие загрузки изображения для WYSIWYG-редактора.
\* Переопределяет vova07\imperavi\actions\UploadAction в части формирования наименования файла
\* и создания ресайза изображения.
*
\* @author Belotur
\* @since 02.08.2016
\* @package backend\actions
*/
class WswUploadAction extends UploadAction {
protected $_validator = 'image';
const MAX_SIDE_LENGTH = 600;
/**
\* @inheritdoc
_/
public function run()
{
if (Yii::$app->request->isPost) {
$file = UploadedFile::getInstanceByName($this->uploadParam);
$model = new DynamicModel(compact('file'));
$model->addRule('file', $this->_validator, $this->validatorOptions)->validate();
if ($model->hasErrors()) {
$result = [
'error' => $model->getFirstError('file')
];
} else {
if ($this->unique === true && $model->file->extension) {
$model->file->name = $this->generateFileName($model->file);
}
try {
$result = $this->saveImage($model);
} catch (\Exception $e) {
$result = [
'error' => $e->getMessage()
];
}
}
Yii::$app->response->format = Response::FORMAT_JSON;
return $result;
} else {
throw new BadRequestHttpException('Only POST is allowed');
}
}
/__
\* Генерация имени файла
\* @param UploadedFile $file объект файла
*
\* @return string
*/
protected function generateFileName($file)
{
$name = str_replace('.'.$file->extension, '', $file->name);
$name = preg_replace('/(\d+)/m', '', $name);
$name = TransliteratorHelper::process($name, '?', 'en').'-'.time();
return $name . '.' . $file->extension;
}
/_*
\* Сохранение изображение с пропорциональным изменением размера
\* @param DynamicModel $model динамическая модель
*
\* @return array
\* @throws Exception
*/
protected function saveImage(DynamicModel $model) {
try {
$image = Image::getImagine()->open(Yii::getAlias($model->file->tempName));
$image_size = $image->getSize();
if ($image_size->getWidth() < $image_size->getHeight()) {// вертикальная ориентация
$ratio = $image_size->getHeight()/self::MAX_SIDE_LENGTH;
$width = round($image_size->getWidth() / $ratio);
$height = self::MAX_SIDE_LENGTH;
} else {// горизонтальная ориентация
$ratio = $image_size->getWidth()/self::MAX_SIDE_LENGTH;
$width = self::MAX_SIDE_LENGTH;
$height = round($image_size->getHeight() / $ratio);
}
$image->thumbnail(new Box($width, $height))->save($this->path . $model->file->name);
$result = ['filelink' => $this->url . $model->file->name];
if ($this->uploadOnlyImage !== true) {
$result['filename'] = $model->file->name;
}
} catch (\Exception $e) {
throw new Exception(Yii::t('vova07/imperavi', 'ERROR_CAN_NOT_UPLOAD_FILE') . $e->getMessage());
}
return $result;
}
}
from yii2-imperavi-widget.
То же самое с getName().
Нет возможности поменять логику генерации имени файла.
from yii2-imperavi-widget.
Related Issues (20)
- Как изменить цвет заголовка? HOT 1
- Sticky блок HOT 3
- Конструкция "="" в тегах <img> HOT 2
- Как изменить список удаляемых тегов? HOT 7
- GetImagesAction and GetFilesAction return invalid paths for files in subfolders
- При редактировании теряется форматирование HOT 1
- Some strange happens with versions HOT 1
- Как разрешить отображение тега "script" HOT 7
- Spell Check
- Редактор не сразу появляется при переключении табов компонента yii/bootstrap4/tabs HOT 1
- How to control buttons? HOT 5
- Проблема с тегом <p> HOT 3
- Редактор дублирует текст при вставке HOT 1
- How to add superscript and subscript buttons?
- Не выводится стиль форматирования h6
- Please add en.js to the language folder
- Тэг p внутри li
- CodeMirror implementation for source
- При загрузке картинки ошибка
- Bugs on adding an image
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from yii2-imperavi-widget.