98 lines
2.2 KiB
PHP
98 lines
2.2 KiB
PHP
<?php
|
|
|
|
require_once (__DIR__.'/util.php');
|
|
|
|
/**
|
|
* Creates a thumb from an existing full image.
|
|
*
|
|
* @param string $schema The name of schema
|
|
* @param string $file The file name
|
|
* @param integer $width The width of the thumb
|
|
* @param integer $height The height of the thumb
|
|
**/
|
|
class Thumb extends Vn\Web\RestRequest
|
|
{
|
|
function run ()
|
|
{
|
|
// XXX: Uncomment only to test the script
|
|
//$_SERVER['REQUEST_URI'] = 'catalog/200x200/e_cinerea.png';
|
|
|
|
$db = $this->getSysConn ();
|
|
|
|
// Gets parameters from URI.
|
|
|
|
$uriSplit = explode ('/', $_SERVER['REQUEST_URI']);
|
|
$uriSplit = array_slice ($uriSplit, count ($uriSplit) - 3, 3);
|
|
|
|
if (count ($uriSplit) < 3)
|
|
throw new Exception ('Bad request');
|
|
|
|
$schema = $uriSplit[0];
|
|
$orgFile = $uriSplit[2];
|
|
$file = $orgFile;
|
|
|
|
if (strrpos ($file, '.') === FALSE)
|
|
$file .= '.png';
|
|
|
|
$size = explode ('x', $uriSplit[1]);
|
|
|
|
if (count ($size) < 2)
|
|
throw new Exception ('Bad request');
|
|
|
|
$width = (int) $size[0];
|
|
$height = (int) $size[1];
|
|
|
|
// Verifies that it is an allowed size.
|
|
|
|
$params = [
|
|
'schema' => $schema
|
|
,'width' => $width
|
|
,'height' => $height
|
|
];
|
|
|
|
$row = $db->getValue (
|
|
'SELECT crop
|
|
FROM image_schema s
|
|
JOIN image_schema_size z ON z.image_schema_id = s.id
|
|
WHERE s.name = #schema
|
|
AND z.width = #width
|
|
AND z.height = #height'
|
|
,$params
|
|
);
|
|
|
|
if (!isset ($row))
|
|
throw new Exception ('Size not allowed');
|
|
|
|
// Creates the thumb.
|
|
|
|
|
|
$util = new Util ($this->app);
|
|
$baseDir = "{$util->dataDir}/$schema";
|
|
$srcFile = "$baseDir/full/$file";
|
|
$dstFile = "$baseDir/{$width}x{$height}/$file";
|
|
$symbolicSrc = "../full/$file";
|
|
|
|
if (!file_exists ($srcFile))
|
|
throw new Exception ('Source not exists');
|
|
if (file_exists ($dstFile))
|
|
throw new Exception ('Destination already exists');
|
|
|
|
$image = Image::create ($srcFile);
|
|
Image::resizeSave ($image, $dstFile, $height, $width, $row, $symbolicSrc);
|
|
imagedestroy ($image);
|
|
|
|
// Sends the thumb to the client
|
|
|
|
$useXsendfile = $db->getValue ('SELECT use_xsendfile FROM image_config');
|
|
|
|
if ($useXsendfile)
|
|
{
|
|
header ("X-Sendfile: $dstFile");
|
|
header ("Content-Type: image/png");
|
|
}
|
|
else
|
|
header ("Location: {$_SERVER['REQUEST_URI']}");
|
|
}
|
|
}
|
|
|