contao/test — Issue #985: Hook nach speichern eines Bildes
Author: felixpfeiffer
Created: 2011-11-29 07:07:56+00:00
State: open
Labels: Feature, framework

Hallo Leo,

ich habe es bei einem laufenden Projekt mit einem Server zu tun, der ganz merkwürdige Rechte hat. Leider ist der Kunde nicht so gerne bereit den Server zu wechseln.
Das konkrete Problem ist, dass die Bilder in der getImage() Methode nach dem Speichern nur Leserechte für den Server bekommen (0600). Also werde sie auf den Seiten nicht angezeigt. Ich weiß, total behämmert.
Nun hatte ich die Idee für jedes Bild nach dem Speichern die Rechte anzupassen (0644). Dafür bräuchte ich aber einen Hook, den man evtl. auch noch für andere Dinge nutzen könnte:
Hier mein Vorschlag für die getImage()

```
/**
* Resize an image
* `param string
* `param integer
* `param integer
* `param string
* @return string
*/
protected function getImage($image, $width, $height, $target=null)
{
if (

![](strlen($image))
{
return null;
}

$image = urldecode($image);

// Check whether file exists
if ()file_exists(TL_ROOT . '/' . $image))
{
$this->log('Image "' . $image . '" could not be found', 'Controller getImage()', TL_ERROR);
return null;
}

$objFile = new File($image);
$arrAllowedTypes = trimsplit(',', strtolower($GLOBALS['TL_CONFIG']['validImageTypes']));

// Check file type
if (

![](in_array($objFile->extension, $arrAllowedTypes))
{
$this->log('Image type "' . $objFile->extension . '" was not allowed to be processed', 'Controller getImage()', TL_ERROR);
return null;
}

$strCacheName = 'system/html/' . $objFile->filename . '-' . substr(md5('-w' . $width . '-h' . $height . '-' . $image), 0, 8) . '.' . $objFile->extension;

// Resize original image
if ($target)
{
$strCacheName = $target;
}

// Return the path of the new image if it exists already
elseif (file_exists(TL_ROOT . '/' . $strCacheName))
{
return $strCacheName;
}

// Return the path to the original image if GDlib cannot handle it
if ()extension_loaded('gd') ||

![]($objFile->isGdImage || ()$width &&

![]($height) || $width > 1200 || $height > 1200)
{
return $image;
}

$intPositionX = 0;
$intPositionY = 0;
$intWidth = $width;
$intHeight = $height;

// Resize width and height and crop the image if necessary
if ($intWidth && $intHeight)
{
if (($intWidth ** $objFile->height) )= ($intHeight ** $objFile->width))
{
$intWidth = ceil($objFile->width * $height / $objFile->height);
$intPositionX = -intval(($intWidth - $width) / 2);

if ($intWidth < $width)
{
$intWidth = $width;
$intHeight = ceil($objFile->height * $width / $objFile->width);
$intPositionX = 0;
$intPositionY = -intval(($intHeight - $height) / 2);
}
}

$strNewImage = imagecreatetruecolor($width, $height);
}

// Calculate height if only width is given
elseif ($intWidth)
{
$intHeight = ceil($objFile->height * $width / $objFile->width);
$strNewImage = imagecreatetruecolor($intWidth, $intHeight);
}

// Calculate width if only height is given
elseif ($intHeight)
{
$intWidth = ceil($objFile->width * $height / $objFile->height);
$strNewImage = imagecreatetruecolor($intWidth, $intHeight);
}

$arrGdinfo = gd_info();
$strGdVersion = preg_replace('/[^0-9\.]+/', _, $arrGdinfo['GD Version']);

switch ($objFile->extension)
{
case 'gif':
if ($arrGdinfo['GIF Read Support'])
{
$strSourceImage = imagecreatefromgif(TL_ROOT . '/' . $image);
$intTranspIndex = imagecolortransparent($strSourceImage);

// Handle transparency
if ($intTranspIndex >= 0)
{
$arrColor = imagecolorsforindex($strSourceImage, $intTranspIndex);
$intTranspIndex = imagecolorallocate($strNewImage, $arrColor['red'], $arrColor['green'], $arrColor['blue']);
imagefill($strNewImage, 0, 0, $intTranspIndex);
imagecolortransparent($strNewImage, $intTranspIndex);
}
}
break;

case 'jpg':
case 'jpeg':
if ($arrGdinfo['JPG Support'] || $arrGdinfo['JPEG Support'])
{
$strSourceImage = imagecreatefromjpeg(TL_ROOT . '/' . $image);
}
break;

case 'png':
if ($arrGdinfo['PNG Support'])
{
$strSourceImage = imagecreatefrompng(TL_ROOT . '/' . $image);

// Handle transparency (GDlib >= 2.0 required)
if (version_compare($strGdVersion, '2.0', '>='))
{
imagealphablending($strNewImage, false);
$intTranspIndex = imagecolorallocatealpha($strNewImage, 0, 0, 0, 127);
imagefill($strNewImage, 0, 0, $intTranspIndex);
imagesavealpha($strNewImage, true);
}
}
break;
}

// New image could not be created
if (

![]($strSourceImage)
{
$this->log('Image "' . $image . '" could not be processed', 'Controller getImage()', TL_ERROR);
return null;
}

imagecopyresampled($strNewImage, $strSourceImage, $intPositionX, $intPositionY, 0, 0, $intWidth, $intHeight, $objFile->width, $objFile->height);

// Fallback to PNG if GIF ist not supported
if ($objFile->extension == 'gif' && )$arrGdinfo['GIF Create Support'])
{
$objFile->extension = 'png';
}

// Create new image
switch ($objFile->extension)
{
case 'gif':
imagegif($strNewImage, TL_ROOT . '/' . $strCacheName);
break;

case 'jpg':
case 'jpeg':
imagejpeg($strNewImage, TL_ROOT . '/' . $strCacheName, (!$GLOBALS['TL_CONFIG']['jpgQuality'] ? 80 : $GLOBALS['TL_CONFIG']['jpgQuality']));
break;

case 'png':
imagepng($strNewImage, TL_ROOT . '/' . $strCacheName);
break;
}

// HOOK: after image was wrtitten to the server
if (array_key_exists('processCreatedImagefile', $GLOBALS['TL_HOOKS']) &&
is_array($GLOBALS['TL_HOOKS']['processCreatedImagefile']))
{
foreach ($GLOBALS['TL_HOOKS']['processCreatedImagefile'] as $callback)
{
$this->import($callbackr0);
$this->$callbackr0->$callbackr1($strCacheName);
}
}

// Destroy temporary images
imagedestroy($strSourceImage);
imagedestroy($strNewImage);

// Return path to new image
return $strCacheName;
}
```

Ich kann gut verstehen, wenn Du das als Einzelschicksal abtust, aber evtl. bietet der Hook ja wie gesagt noch andere Möglichkeiten.

Andererseits würde mich natürlich interessieren, ob Du noch eine andere Lösung sehen würdest, die dieses Problem behebn kann - Serverwechsel ist momentan als Lösung nicht drin ;-).

Gruß, Felix

--- _Originally created on September 2nd, 2009, at 05:27pm (ID 985)_