我正在尝试将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
?
答案 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;
}
请注意,这不是所有未经测试的示例代码。