ave-cms/inc/thumb.php

357 lines
8.3 KiB
PHP
Raw Normal View History

2017-06-24 00:58:56 +03:00
<?php
/**
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
* @license GPL v.2
*/
2020-05-28 08:47:53 +03:00
if (! defined('BASE_DIR'))
2017-06-24 00:58:56 +03:00
define('BASE_DIR', str_replace("\\", "/", dirname(dirname(__FILE__))));
if (! function_exists('iptc_make_tag'))
{
2020-05-28 08:47:53 +03:00
function iptc_make_tag ($rec, $data, $value)
2017-06-24 00:58:56 +03:00
{
$length = strlen($value);
$retval = chr(0x1C) . chr($rec) . chr($data);
if($length < 0x8000)
{
$retval .= chr($length >> 8) . chr($length & 0xFF);
}
else
2017-09-21 09:50:14 +03:00
{
$retval .= chr(0x80) .
chr(0x04) .
chr(($length >> 24) & 0xFF) .
chr(($length >> 16) & 0xFF) .
chr(($length >> 8) & 0xFF) .
chr($length & 0xFF);
}
2017-06-24 00:58:56 +03:00
return $retval . $value;
}
}
/**
* Creates directory
*
* @param string $path Path to create
* @param integer $mode Optional permissions
* @return boolean Success
*/
2020-06-06 19:11:46 +03:00
if (! function_exists('_mkdir'))
2017-06-24 00:58:56 +03:00
{
2020-06-06 19:11:46 +03:00
function _mkdir ($path, $mode = 0777)
{
$old = umask(0);
$res = @mkdir($path, $mode);
umask($old);
2017-06-24 00:58:56 +03:00
2020-06-06 19:11:46 +03:00
return $res;
}
2017-06-24 00:58:56 +03:00
}
/**
* Creates directories recursively
*
* @param string $path Path to create
* @param integer $mode Optional permissions
* @return boolean Success
*/
2020-06-06 19:11:46 +03:00
if (! function_exists('rmkdir'))
2017-06-24 00:58:56 +03:00
{
2020-06-06 19:11:46 +03:00
function rmkdir ($path, $mode = 0777)
{
return is_dir($path) || (mkdir(dirname($path), $mode) && _mkdir($path, $mode));
}
2017-06-24 00:58:56 +03:00
}
2020-05-28 08:47:53 +03:00
if (filesize(BASE_DIR . '/config/config.inc.php'))
require_once BASE_DIR . '/config/config.inc.php';
2018-05-19 20:30:18 +03:00
2020-05-28 08:47:53 +03:00
require_once BASE_DIR . '/inc/config.php';
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
//-- Разрешенные расширения файлов
2020-06-06 19:11:46 +03:00
$allowedExt = [
'jpg',
'jpeg',
'png',
'gif',
'JPG',
'JPEG',
'PNG',
'GIF'
];
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
//-- Разрешенные размеры миниатюр
2018-08-08 15:18:20 +03:00
$allowedSize = (defined('THUMBNAIL_SIZES') && THUMBNAIL_SIZES != '')
2017-09-21 09:50:14 +03:00
? explode(',', trim(THUMBNAIL_SIZES))
2020-05-28 08:47:53 +03:00
: [];
2017-09-21 09:50:14 +03:00
//-- Разрешения для админпанели
2020-05-28 08:47:53 +03:00
$allowedAdmin = [
2017-09-21 09:50:14 +03:00
't128x128',
2018-03-26 10:33:20 +03:00
'f128x128'
2020-05-28 08:47:53 +03:00
];
2017-09-21 09:50:14 +03:00
//-- Ссылка на файл
2017-06-24 00:58:56 +03:00
$imagefile = urldecode($_SERVER['REQUEST_URI']);
2017-09-21 09:50:14 +03:00
//-- Вызов чере $_GET параметры
//-- ToDo
if (! empty($_REQUEST['thumb']))
2017-06-24 00:58:56 +03:00
{
$imagefile = '/'.
rtrim(
dirname($_REQUEST['thumb'])
2017-09-21 09:50:14 +03:00
. '/' . THUMBNAIL_DIR . '/'
. (str_replace(
2017-06-24 00:58:56 +03:00
'.',
2017-09-21 09:50:14 +03:00
(empty($_REQUEST['mode'])
? '-t'
: '-' . $_REQUEST['mode']) . ((empty($_REQUEST['width']) && empty($_REQUEST['height']))
? '128'
: intval(@$_REQUEST['width'])) . 'x' . ((empty($_REQUEST['width']) && empty($_REQUEST['height']))
? '128'
: intval(@$_REQUEST['height'])) . '.',
2017-06-24 00:58:56 +03:00
basename($_REQUEST['thumb'])
)
),
'/');
}
2017-09-21 09:50:14 +03:00
//-- Если пришел прямой вызов файла, то сразу отрубаем его
if ($_SERVER['REQUEST_URI'] == '/inc/thumb.php')
2017-06-24 00:58:56 +03:00
die('No image');
2017-09-21 09:50:14 +03:00
//-- Базовая папка
$baseDir = str_replace('\\', '/', dirname(dirname(__FILE__)));
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
//-- Если файл существует, показываем его
if (file_exists($baseDir . $imagefile))
2017-06-24 00:58:56 +03:00
{
$img_data = @getimagesize($baseDir . $imagefile);
2017-09-21 09:50:14 +03:00
2020-06-06 19:11:46 +03:00
header('max-age=315360000, public', true);
2017-06-24 00:58:56 +03:00
header('Content-Type:' . $img_data['mime'], true);
2020-06-06 19:11:46 +03:00
header("Expires: " . gmdate("D, d M Y H:i:s", time() + THUMBNAIL_CACHE_LIFETIME) . " GMT");
2017-06-24 00:58:56 +03:00
header("Content-Length: " . (string) filesize($baseDir . $imagefile), true);
2020-06-06 19:11:46 +03:00
2017-06-24 00:58:56 +03:00
readfile($baseDir . $imagefile);
2017-09-21 09:50:14 +03:00
2017-06-24 00:58:56 +03:00
exit;
}
2020-05-28 08:47:53 +03:00
require_once BASE_DIR . '/inc/init.php';
2017-06-24 00:58:56 +03:00
list(, $thumbPath) = explode('/' . UPLOAD_DIR . '/', dirname($imagefile), 2);
$lenThumbDir = strlen(THUMBNAIL_DIR);
2018-05-19 20:30:18 +03:00
// --
2017-06-24 00:58:56 +03:00
if ($lenThumbDir && substr($thumbPath, -$lenThumbDir) != THUMBNAIL_DIR)
2018-05-19 20:30:18 +03:00
{
2018-05-20 03:06:29 +03:00
if (! file_exists($baseDir . $imagefile))
{
report404();
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
}
2017-06-24 00:58:56 +03:00
exit(0);
2018-05-19 20:30:18 +03:00
}
2017-06-24 00:58:56 +03:00
$thumbPath = $baseDir . '/' . UPLOAD_DIR . '/' . $thumbPath;
$imagePath = $lenThumbDir ? dirname($thumbPath) : $thumbPath;
$thumbName = basename($imagefile);
$nameParts = explode('.', $thumbName);
$countParts = count($nameParts);
2018-05-19 20:30:18 +03:00
if ($countParts < 2 || ! in_array(strtolower(end($nameParts)), $allowedExt))
2017-06-24 00:58:56 +03:00
exit(0);
2020-05-28 08:47:53 +03:00
$matches = [];
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
//-- Смотрим переданные параметры
preg_match('/-(r|c|f|t|s)(\d+)x(\d+)(r)*$/i', $nameParts[$countParts-2], $matches);
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
//-- Если нет параметров, отдаем 404
if (! isset($matches[0]))
2017-06-24 00:58:56 +03:00
{
2018-05-19 20:30:18 +03:00
report404();
2017-06-24 00:58:56 +03:00
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
exit(0);
}
2017-09-21 09:50:14 +03:00
$check = ltrim($matches[0], '-');
//-- Проверяем разрешен ли данный размер для миниатюры
if (! empty($allowedSize) && ! in_array($check, $allowedSize))
2017-06-24 00:58:56 +03:00
{
2017-09-21 09:50:14 +03:00
if (! in_array($check, $allowedAdmin))
{
2018-05-19 20:30:18 +03:00
report404();
2017-09-21 09:50:14 +03:00
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
exit(0);
}
2017-06-24 00:58:56 +03:00
}
2017-09-21 09:50:14 +03:00
//-- Если есть параметр rotate
if (isset($matches[4]))
2017-06-24 00:58:56 +03:00
{
2017-09-21 09:50:14 +03:00
list ($size, $method, $width, $height, $rotate) = $matches;
2017-06-24 00:58:56 +03:00
}
2017-09-21 09:50:14 +03:00
//-- Иначе
else
{
list ($size, $method, $width, $height) = $matches;
$rotate = false;
}
2017-06-24 00:58:56 +03:00
$nameParts[$countParts-2] = substr($nameParts[$countParts-2], 0, -strlen($size));
$imageName = implode('.', $nameParts);
$save = true;
if (! file_exists("$imagePath/$imageName"))
{
2018-03-26 10:33:20 +03:00
$l = "$imagePath/$imageName";
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
if (file_exists($l . '.tmp'))
2017-06-24 00:58:56 +03:00
{
2017-09-21 09:50:14 +03:00
$url = trim(file_get_contents($l . '.tmp'), ABS_PATH);
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
$img = CURL_file_get_contents($url);
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
if ($img)
2017-06-24 00:58:56 +03:00
{
2018-05-20 03:06:29 +03:00
file_put_contents("$imagePath/$imageName", $img);
2017-06-24 00:58:56 +03:00
2020-05-28 08:47:53 +03:00
//setEXIFF("$imagePath/$imageName");
2017-09-21 09:50:14 +03:00
2017-06-24 00:58:56 +03:00
$save = true;
}
2017-09-21 09:50:14 +03:00
@unlink($l . '.tmp');
2017-06-24 00:58:56 +03:00
}
}
if (! file_exists("$imagePath/$imageName"))
{
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
2017-09-21 09:50:14 +03:00
2018-05-19 20:30:18 +03:00
report404();
2018-04-19 19:11:58 +03:00
$imageName = 'noimage.png';
2017-09-21 09:50:14 +03:00
2018-03-26 10:33:20 +03:00
if (! file_exists("$imagePath/$imageName"))
2017-06-24 00:58:56 +03:00
$imagePath = $baseDir . '/' . UPLOAD_DIR . '/images';
2017-09-21 09:50:14 +03:00
2018-03-26 10:33:20 +03:00
if (! file_exists("$imagePath/$imageName"))
2017-09-21 09:50:14 +03:00
exit(0);
2017-06-24 00:58:56 +03:00
$save = false;
}
2020-06-06 19:11:46 +03:00
define('IMAGE_TOOLBOX_DEFAULT_JPEG_QUALITY', JPG_QUALITY);
2018-05-20 03:06:29 +03:00
require $baseDir . '/class/class.thumbnail.php';
2017-06-24 00:58:56 +03:00
$thumb = new Image_Toolbox("$imagePath/$imageName");
2017-09-21 09:50:14 +03:00
//-- Методы генерации миниатюр
2017-06-24 00:58:56 +03:00
switch ($method)
{
case 'r':
$thumb->newOutputSize((int)$width, (int)$height, 0, (boolean)$rotate);
break;
case 'c':
$thumb->newOutputSize((int)$width, (int)$height, 1, (boolean)$rotate);
break;
case 'f':
$thumb->newOutputSize((int)$width, (int)$height, 2, false, '#ffffff');
break;
2017-09-21 09:50:14 +03:00
2017-06-24 00:58:56 +03:00
case 't':
$thumb->newOutputSize((int)$width, (int)$height, 3, false);
break;
2017-09-21 09:50:14 +03:00
case 's':
$thumb->newOutputSize((int)$width, (int)$height, 4, (boolean)$rotate);
break;
2017-06-24 00:58:56 +03:00
}
2020-06-06 19:11:46 +03:00
//Blend
//$thumb->addImage(BASE_DIR . '/' . 'uploads/gallery/watermark.gif');
//$thumb->blend('right -10', 'bottom -10', IMAGE_TOOLBOX_BLEND_COPY, 70);
2017-06-24 00:58:56 +03:00
2020-06-06 19:11:46 +03:00
//Text
//$thumb->addText('Мой текст', BASE_DIR . '/inc/fonts/ft16.ttf', 16, '#709536', 'right -10', 'bottom -10');
//if ($width > 200){
// $thumb->addImage(BASE_DIR . '/' . 'uploads/gallery/watermark.gif');
// $thumb->blend('right -10', 'bottom -10', IMAGE_TOOLBOX_BLEND_COPY, 70);
//}
2017-06-24 00:58:56 +03:00
$thumb->output();
2017-09-21 09:50:14 +03:00
//-- Если можно сохранять миниатюру
2017-06-24 00:58:56 +03:00
if ($save)
{
2018-05-19 20:30:18 +03:00
if (! file_exists($thumbPath) && ! mkdir($thumbPath, 0777, true))
2017-09-21 09:50:14 +03:00
exit(0);
2017-06-24 00:58:56 +03:00
if ($thumb->save("$thumbPath/$thumbName"))
{
$old = umask(0);
chmod("$thumbPath/$thumbName", 0777);
umask($old);
}
2020-05-28 08:47:53 +03:00
if ($thumb->_img['main']['type'] == 2)
2017-09-21 09:50:14 +03:00
{
$image = getimagesize("$thumbPath/$thumbName", $info);
2017-06-24 00:58:56 +03:00
2017-09-21 09:50:14 +03:00
if (! isset($info['APP13']))
{
//-- Если в настройках разрешена генерация IPTC тегов для миниатюр
if (THUMBNAIL_IPTC)
2017-06-24 00:58:56 +03:00
{
2020-05-28 08:47:53 +03:00
$sitename= get_settings('site_name');
2017-09-21 09:50:14 +03:00
// установка IPTC тэгов
2020-05-28 08:47:53 +03:00
$iptc = [
2017-09-21 09:50:14 +03:00
'2#120' => iconv("UTF-8", "WINDOWS-1251", $sitename),
2020-05-28 08:47:53 +03:00
'2#116' => HOST
];
2017-09-21 09:50:14 +03:00
// Преобразование IPTC тэгов в двоичный код
$data = '';
2020-05-28 08:47:53 +03:00
foreach($iptc AS $tag => $string)
2017-09-21 09:50:14 +03:00
{
$tag = substr($tag, 2);
$data .= iptc_make_tag(2, $tag, $string);
}
// Встраивание IPTC данных
$content = iptcembed($data, "$thumbPath/$thumbName");
// запись нового изображения в файл
$fp = fopen("$thumbPath/$thumbName", "wb");
fwrite($fp, $content);
fclose($fp);
2017-06-24 00:58:56 +03:00
}
}
}
}
?>