CakePHP上传器:根据图像尺寸更改调整大小值

时间:2014-04-02 11:25:48

标签: cakephp uploader

我正在尝试将Miles Johnsons优秀的Uploader组件实施到我的应用程序中。但问题在于:根据上传图像的尺寸,我需要更改调整尺寸。

我尝试修改回调中的转换:

    public $actsAs = array(
        'Uploader.Attachment' => array(
            'image' => array(
                'nameCallback' => 'formatName',
                'tempDir' => TMP,
                'uploadDir' => UPLOADDIR,
                'finalPath' => '/img/photos/',
                'overwrite' => false,
                'stopSave' => true,
                'allowEmpty' => false,
                'transforms' => array(
                    array(
                        'class' => 'exif',
                        'self' => true
                    ),
                    'image_sized' => array(
                        'class' => 'resize',
                        'nameCallback' => 'transformSizedNameCallback',
                        'width' => 1680,
                        'height' => 980,
                        'aspect' => true  
                    )
                )
            )
        ),
        'Uploader.FileValidation' => array(
            'image' => array(
                'extension' => array(
                    'value' => array('jpg', 'png', 'jpeg'),
                    'error' => 'Nicht unterstütztes Dateiformat - bitte JPG- oder PNG-Datei hochladen.'
                ),
                'minHeight' => array(
                    'value' => 980,
                    'error' => 'Das Bild muss mindestens 980 Pixel hoch sein.'
                ),
                'minWidth' => array(
                    'value' => 980,
                    'error' => 'Das Bild muss mindestens 980 Pixel breit sein.'
                ),
                'required' => array(
                    'value' => true,
                    'error' => 'Bitte wählen Sie ein Bild aus.'
                )
            )
        )
    );

    public function beforeTransform($options) {
        if($options['dbColumn'] == 'image_sized') {
            if($height > $width) {
                $options['width'] = 980;
                $options['height'] = 1680;
            }
        }
        return $options;
    }

我能够精确定位正确的变换,但如何在beforeTransform内访问要变换的图像尺寸?我从哪里获得$width$height

1 个答案:

答案 0 :(得分:1)

我对它不熟悉,但是从查看代码看起来你似乎唯一的选择就是使用dbColumn值来访问当前处理的字段数据,比如

$file = $this->data[$this->alias][$options['dbColumn']];

当然,这需要dbColumn值来匹配输入字段名称!如果情况并非如此,那么您将需要一个包含字段名称的附加选项,并使用该字段名称。

现在$file只是原始数据,很可能是file upload array。假设有一个文件,请自行检查tmp_name的维度,或者使用可处理文件上传数组的Transite\File类,并公开检索可能图像尺寸的方法:

$transitFile = new File($file);
$dimensions = $transitFile->dimensions();

https://github.com/milesj/transit/blob/1.5.1/src/Transit/File.php#L121

所以最后你可以这样做:

public function beforeTransform($options) {
    if($options['dbColumn'] == 'image_sized') {
        $file = $this->data[$this->alias][$options['dbColumn']];
        $transitFile = new \Transit\File($file);
        $dimensions = $transitFile->dimensions();

        if($dimensions === null) {
            // not an image or something else gone wrong,
            // maybe throw an exception or wave your arms and call for help
        } elseif($dimensions['height'] > $dimensions['width']) {
            $options['width'] = 980;
            $options['height'] = 1680;
        }
    }
    return $options;
}

请注意,这不是所有未经测试的示例代码。