Как правильно загружать и обрабатывать изображения в Yii2?

Вьюшка
<?php $form = ActiveForm::begin([
                'options' => ['enctype'=>'multipart/form-data']
        ]); ?>

    <?=$form->field($model, 'image')->fileInput() ?>
    
    <?=Html::submitButton('Update') ?>
    <?php ActiveForm::end(); ?>


Валидация в модели:
public $image;
    
    public function rules()
    {
        return [        
            [['image'], 'image',  'types' => 'png,jpg', 'skipOnEmpty' => false],
        ];
    }


Контроллер
{
        $dir = Yii::getAlias('@frontend/../web/uploads/test/');
        $uploaded = false;
        $model = new Test();
        
        if ($model->load($_POST)) {
            //$file = UploadedFile::getInstances($model, 'image');
            $file = UploadedFile::getInstance($model, 'image');
            
            $model->image = $file;
            
            if ($model->validate()) {
                $uploaded = $file->saveAs( $dir . $model->image->name );
            }
        }
        
        return $this->render('test',[
             'model' => $model,
             'uploaded' => $uploaded,
             'dir' => $dir,
           ]);
	}


Итак, все работает все отлично грузит. И при этом возникло 3 вопроса и одна большая проблема:
1) Есть ли такой валидатор для нескольких изображений ? Например, я хочу загрузить 10 картинок, нужно будет прогонять каждую через $model->validate(), присваивая значения image, или можно как-то проще ?

2) Безопасен ли коробочный валидатор для изображений? То есть, смогут ли пройти изображения со вредоносным кодом внутри (всякие там евалы и тп.) ?

3) Как сделать транслит из русских символов в забугорные, есть ли фильтр из коробки?

И большая проблема:
К примеру, я хочу загрузить изображение, создать уменьшенную копию и наложить водный знак.
Я подключил плагин imagine и добавил тестовый пример из документации:
if ($model->validate()) {
                $uploaded = $file->saveAs( $dir . $model->image->name );
                Image::thumbnail($dir.$model->image->name, 120, 120)->save($dir.'thumb-test-image.jpg', ['quality' => 50]);
            }


Каково же было мое удивление, когда эта штука ложит апач. При этом нет никаких логов в php и yii2, только логи апача, да и те непонятные:

[Mon Apr 28 20:07:27.348978 2014] [mpm_winnt:notice] [pid 5284:tid 336] AH00428: Parent: child process 1304 exited with status 3221226519 -- Restarting.
[Mon Apr 28 20:07:27.533998 2014] [bw:notice] [pid 5284:tid 336] mod_bw : Memory Allocated 0 bytes (each conf takes 40 bytes)
[Mon Apr 28 20:07:27.533998 2014] [bw:notice] [pid 5284:tid 336] mod_bw : Version 0.92 - Initialized [0 Confs]
[Mon Apr 28 20:07:27.533998 2014] [bw:notice] [pid 5284:tid 336] mod_bw : Supported resolution for Timers [ Min: 1 Max: 1000000 ]
[Mon Apr 28 20:07:27.533998 2014] [bw:notice] [pid 5284:tid 336] mod_bw : Enabling High resolution timers [ 1 ms ]
[Mon Apr 28 20:07:28.969246 2014] [ssl:warn] [pid 5284:tid 336] AH01873: Init: Session Cache is not configured [hint: SSLSessionCache]
[Mon Apr 28 20:07:38.281074 2014] [ssl:warn] [pid 1892:tid 356] AH01909: RSA certificate configured for test.ru:443 does NOT include an ID which matches the server name
[Mon Apr 28 20:07:38.282074 2014] [ssl:warn] [pid 1892:tid 356] AH01909: RSA certificate configured for tdd.com:443 does NOT include an ID which matches the server name
...
[Mon Apr 28 20:07:38.292076 2014] [ssl:warn] [pid 1892:tid 356] AH01909: RSA certificate configured for default:443 does NOT include an ID which matches the server name
[Mon Apr 28 20:07:38.292076 2014] [ssl:warn] [pid 1892:tid 356] AH02292: Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Mon Apr 28 20:07:38.389088 2014] [bw:notice] [pid 1892:tid 356] mod_bw : Memory Allocated 0 bytes (each conf takes 40 bytes)
[Mon Apr 28 20:07:38.389088 2014] [bw:notice] [pid 1892:tid 356] mod_bw : Version 0.92 - Initialized [0 Confs]
[Mon Apr 28 20:07:38.389088 2014] [bw:notice] [pid 1892:tid 356] mod_bw : Supported resolution for Timers [ Min: 1 Max: 1000000 ]
[Mon Apr 28 20:07:38.390088 2014] [bw:notice] [pid 1892:tid 356] mod_bw : Enabling High resolution timers [ 1 ms ]
[Mon Apr 28 20:07:38.905153 2014] [ssl:warn] [pid 1892:tid 356] AH01873: Init: Session Cache is not configured [hint: SSLSessionCache]
[Mon Apr 28 20:07:38.905153 2014] [ssl:warn] [pid 1892:tid 356] AH01909: RSA certificate configured for test.ru:443 does NOT include an ID which matches the server name
[Mon Apr 28 20:07:38.906153 2014] [ssl:warn] [pid 1892:tid 356] AH01909: RSA certificate configured for tdd.com:443 does NOT include an ID which matches the server name
...
[Mon Apr 28 20:07:38.914155 2014] [ssl:warn] [pid 1892:tid 356] AH02292: Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Mon Apr 28 20:07:39.417240 2014] [mpm_winnt:notice] [pid 1892:tid 356] AH00354: Child: Starting 32 worker threads.
  • Вопрос задан
  • 23209 просмотров
Решения вопроса 1
vyachin
@vyachin
Ищу работу
1. Проверить несколько файлов можно так www.yiiframework.com/doc-2.0/guide-input-file-uplo... file валидатор умеет проверять массив файлов, а поскольку image валидотор сделан на его основе https://github.com/yiisoft/yii2/blob/master/framew...
This validator checks if the input value represents a valid image file. It extends from the file validator and thus inherits all its properties.

тогда и он может

2. Image валидатор всего лишь получает метрики изображения https://github.com/yiisoft/yii2/blob/master/framew... и сравнивает их с теми что вы указали в настройках валидации. Можно создать валидное изображение с вредоносным кодом. Потенциально это дырка в безопасности. Можно обезопасить себя через "пересборку" изображения под конкретные размеры, для nginx почитайте тут habrahabr.ru/post/94435 или можно реализовать подобное на php с кешированием, но работать конечно будет медленнее.

3. Есть, вот пример использования https://github.com/yiisoft/yii2/blob/master/framew...

Ответ на ваш главный вопрос - это количество памяти которое кушает расширение отвечающее за работу с изображениями. GD нужно меньше, а вот ImageMagic кушает совсем не прилично много.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Superwow3D
Воспользовался вашей инструкцией при загрузке. У меня валидатор ругался на 'types' , пришлось заменить на mimeTypes.
Ответ написан
Комментировать
@kuftachev
Во-первых, выносить логику сохранения в контроллер - это уже не правильно в принципе!
Во-вторых, зачем boolean $uploaded?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы