Как сделать, чтобы скрипт создавал картинку или перенаправлял на существующую?

Person

Новичок
Как сделать, чтобы скрипт создавал картинку или перенаправлял на существующую?

Хочу написать небольшой скрипт. Скрипт ищет изображения на сервере, если находит, то он должен возратить ссылку на уже существующее изображение. А иначе он создаёт сам изображение на сервере, сохраняет его и возращает ссылку на только что созданное... Ну несколько сумбурно описал.
В общем допустим искомый скрипт написан:
www.someserver.com/script.php

Если его вставить в тэги <img src=www.someserver.com/script.php>, то он показывает либо www.someserver.com/foundimage.jpg , либо создаёт www.someserver.com/newcreatedimage.jpg и показывает его. Надеюсь меня поймут, я на пхп не так давно программирую
 

Person

Новичок
В том, что я не могу тупо написать echo "www.someserver.com/image.jpg" ... Т.е. скрипт должен возращать заголов image/jpeg или другой граф. формат, но при этом нужно, чтобы изображение не создавалось заново, если он уже есть, а бралось с сервера...
 

_vampiro_

Новичок
ИМХО "тупо написать" может любой. Не горячись и поверь в себя.

Что ты УЖЕ сделал? поиск картинки сделал? Вывод заголовков? Вывод этой картинки? Вывод картинки "Нифига на этом сервере нету"?
 

Gorynych

Посетитель PHP-Клуба
Person проблема делится на две:

в скрипте, который формирует HTML-вывод всей страницы пишем <img src="view.php?imgfile=имя_файла">

собственно, отдача файла на примере pdf описана в руководстве - http://ru.php.net/header Делаем наш view.php по образу и подобию примера, заменяя Content-type на 'image/jpeg', 'image/gif', 'image/png' в зависимости от картинки. Ах да, имя нужной картинки будет приходить к нам как $_GET['imgfile']

недостатки: с точки зрения браузера имя картинки будет некрасивым - view.php?imgfile=имя_файла

варианта (на вскидку) два:

а) поискать решения этой проблемы по ключевым словам Content-Disposition (было это где-то неоднократно)

б) в HTML-формирующем скрипте писать <img src="/imgcatalog/имя_файла"> и использовать mod_rewrite для того, чтобы перенаправлять запрос в наш view.php
 

_vampiro_

Новичок
Gorynych
Глядя на фразу
Ах да, имя нужной картинки будет приходить к нам как $_GET['imgfile']
читать
использовать mod_rewrite для того, чтобы перенаправлять запрос в наш view.php
без слез не возможно:)

Следует учесть только кеширование картинок и добавить к ссылкам "рандом-аппендикс".
 

Gorynych

Посетитель PHP-Клуба
_vampiro_
так как большая часть моей жизни протекает вне форумов PHP-Клуба, я не всегда понимаю местный диалект. Т.е. я в курсе, что в основном здесь хорошим тоном считается не отвечать, а выискивать чем можно поддеть ответившего ранее. Но что именно Вас так расстрогало именно сейчас?

б) в HTML-формирующем скрипте писать <img src="/imgcatalog/имя_файла"> и использовать mod_rewrite для того, чтобы перенаправлять запрос в наш view.php
попробую разжевать (может я слишком быстро пишу?). Имеется ввиду, что будет формироваться HTML-код вида:
Код:
test.php
======
...
echo "<img src=\"/imgcatalog/picture.jpg" />";
использовать mod_rewrite для того, чтобы перенаправлять запрос в наш view.php
означает, что в файл .htaccess встраивается конструкция:
Код:
RewriteEngine On
RewriteRule (imgcatalog/)(.+)$ /view.php?imgfile=$2 [L]
в результате этих действий, скрипт view.php получает ИМЯ нужной картинки в виде GET-параметра, т.е. как $_GET['imgfile']

Вы поспеваете за мыслью? Тогда смотрим на примерный код view.php:
Код:
if ( !isset($_GET['imgfile']) || !$_GET['imgfile'] ) {
    exit;
}

$contType = null;
$imgFile = null;

/*
    поиск картинки с именем $_GET['imgfile']

    Если нашли - выясняем расширение 
    и сохраняем в переменной $contType
        gif             -> "image/gif"
        jpg или jpeg    -> "image/jpeg"
        png             -> "image/png"

    Если не нашли - генерируем изображение 
    с нужным расширением, которе запоминаем
    аналогично

    Имя файла картинки (с путем!) сохраняем 
    в переменной $imgFile
*/

if ( $imgFile && $contType ) {
    header('Content-type: '.$contType);
    header('Content-Disposition: inline; filename="'.$_GET['imgfile'].'"');
    readfile($imgFile);
}
exit;
результатом таких действий будет то, что в HTML коде исчезнет упоминание о view.php и останется только /imgcatalog/picture.jpg

что именно вызывает слезы на ваших глазах?
 

_vampiro_

Новичок
Gorynych
:) Та не, просто уровень детализации, с которым подана информация о передаче имени файла методом GET "слегка" отличался от того, как было подано про МодРеврайт.

Последовавший вслед за этим ваш пост про его использование с детальным примером подвел оба описания к нужному уровню. Безусловно, теперь Person справится со своей проблемой и выразит Вам свою благодарность! Мой же пост преследовал единственную цель - попросить Вас более подробно описать применение Мода. За что вам отдельное Спасибо!
 

Gorynych

Посетитель PHP-Клуба
_vampiro_
можно было просто спросить.

на самом деле, где-то в недрах другого форума лет пять назад было сломано много копий на тему того, какие надо создать заголовки, чтобы при скачивании файла (аналогичная по сути задача) отдавалось корректное имя файла, а не имя скрипта. Но мне лень сейчас искать.

вариант с mod_rewrite - это просто быстрое решение, но оно преносит часть работы на веб-сервер (фактически, ради красоты имени файла мы заставляем Апач выполнять лишнюю работу). Если сервер работает под большой нагрузкой и количество посетителей достаточно велико, все эти танцы с mod_rewrite создают лишние запросы и перенаправления, что не очень-то хорошо.
 

Person

Новичок
Ух... Спасибо за настолько развёрнутый ответ :) Даже вопросов не осталось. Ещё раз спасибо за помощь! =)
 

Gorynych

Посетитель PHP-Клуба
Даже вопросов не осталось
не уверен :)

для вашей задачи (как я ее понял) Вам еще нужно:

а) делать корректный поиск существующих изображений

б) не ошибиться при указании точного имени найденного изображения в readfile(...) - классической граблей является тот факт, что при рекурсивном просмотре каталогов люди забывают о том, что скрипт и просматриваемый каталог могут лежать в совершенно разных местах :)

в) ну и генерировать картинку (заглушку или что?) при отсутсвии нужного изображения
 
Сверху