Git Product home page Git Product logo

Comments (2)

Belotur avatar Belotur commented on June 5, 2024 1

А такой вариант не поможет: 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.

ashatrov avatar ashatrov commented on June 5, 2024

То же самое с getName().
Нет возможности поменять логику генерации имени файла.

from yii2-imperavi-widget.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.