Скрытая загрузка картинок на PHP

Представляю вашему вниманию один очень простой код, который тем не менее открывает не хилые перспективы в использовании картинок в дорвеестроении.

<?
{$fp = fopen($_SERVER[‘DOCUMENT_ROOT’].’/img.php’, ‘w+’);
fwrite($fp, ‘<? header(«Content-type: image/gif»);  readfile ($_SERVER[«DOCUMENT_ROOT»].»/fotka/1.jpeg»); ?>’);
fclose($fp);}

echo  (‘<img src=img.php>’);

?>

Чем этот код так замечателен?
1) Вместо img.php вы можете подсунуть ключ.

2) Вместо $_SERVER[«DOCUMENT_ROOT»].»/fotka/1.jpeg» вы можете подставить любой путь. Тоесть это может быть путь на сервере как в примере, а может и урл с другого сайта. То есть вам даже хранить файлы не придется.

Но это не все. Подумав еще немного я пришел к такой мысли.
Добавим в .htaccess строчку:

AddType application/x-httpd-php .jpeg

А основной текст исправим на

<?
{$fp = fopen($_SERVER[‘DOCUMENT_ROOT’].’/img.jpeg’, ‘w+’);
fwrite($fp, ‘<? header(«Content-type: image/gif»);  readfile ($_SERVER[«DOCUMENT_ROOT»].»/fotka/1.jpeg»); ?>’);
fclose($fp);}

echo  (‘<img src=img.jpeg>’);

?>

Чувствуете разницу?

Теперь комар носу не подточит! Браузер запрашивает картинку, браузер получает картинку! 🙂

Тоесть этот код позволяет сделать полноценное переименовывание «на лету». Если у вас картинки имеют имена 1.jpeg, 2.jpeg и т.д., то вы сможете их отдавать как ключ1.jpeg, ключ2.jpeg. Или как в примере при запросе img.jpeg отдает /fotka/1.jpeg

Сюда можно еще прикрутить проверку наличия, чтобы код не выполнять заново каждый раз и не пытался создать уже созданный файл. Надо просто приписать одну строку перед началом кода

if ( !file_exists($_SERVER[‘DOCUMENT_ROOT’].’/wp-content/plugins/elsperpostovoy/plagin_e_postovie.php’))

но это уже детали

__

Офтоп:
Красноярцы, почувствовали землетрясение?
3 бала полтора часа назад было.

____

UPD.

В комментах возникло обсуждение и Мегамозг предложил отличный вариант. Исправив, мелкие ошибки, выкладываю его тут:

В .htaccess пишем строку

RewriteRule ^([0-9]+)(.*).jpeg$ /ff.php?im=$1 [L]

Если файла до этого момента не было, то не забудьте первым делом написать строку

RewriteEngine On

Далее, в файле ff.php пишем

<?php
header(«Content-type: image/gif»);
readfile($_SERVER[«DOCUMENT_ROOT»].’/foto/’.(int)$_GET[«im»].’.jpg’);
?>

Где, «/foto/» это папка с пронумерованными картинками типа .jpg, при желании конечно можно поменять и папку и тип, и сам файл вместо ff.php назвать иначе.

После этих простых действий вы сможете обращаться к файлу по адресу:

сайт.ру/номер файла/транслитирированный ключ.jpeg

Выгода очевидна. Роботы видят что файл называется «транслитирированный ключ.jpeg», а сервер подсовывает вместо этого файл «адрес на сервере/foto/номер файла.jpg»

Разумеется эти ухищрения имеют смысл, если вам или просто лень заранее переименовывать все файлы, или же если на одном сервере пачка доров и они юзают одну и ту же пачку картинок. Правда в этом случае всеравно придется прикручивать файл соответствий, но думаю это уже не вызовет проблем. Если вызовет, спрашивайте, все объясню.


Автор: Elsper.ru


VN:F [1.9.14_1148]
Rating: 4.4/10 (7 votes cast)
Скрытая загрузка картинок на PHP, 4.4 out of 10 based on 7 ratings

11 thoughts on “Скрытая загрузка картинок на PHP

  1. Ну, во-первых, нужно указать:
    header(”Content-type: image/jpeg”)
    если уж отдаешь jpeg-картинку. Иначе с каким-то из браузеров будут проблемы.

    Что значит «даже хранить не потребуется»? fwrite сохраняет картинку в файл. И при КАЖДОМ запуске страницы обращается к месту, где хранится картинка и загружает ее (для примера с внешним сервером — скрипт будет при каждом обращении скачивать картинку. Мне кажется, дешевле хранить ее постоянно).

    Если таким образом делать 2 картинки — пользователь получит только одну.

    Не удобнее ли будет перенаправлять (через RewriteRule в .htaccess) картинки *.jpeg на файл zzz.php? А в зависимости от названия скрипт подгрузит нужную картинку.

  2. Не проще ли сразу назвать картинки нормально — ключ1.jpg, ключ2.jpg? Путаницы с ними в дальнейшем будет меньше, и найти её будет легче.

    И самое главное, зачем для отдачи картинок ещё и PHP привлекать? Только создавать дополнительную нагрузку 🙂

  3. Там где я прочитал про Content-type: image/gif говорилось, что гиф универсальный тип и подходит для любой картинки, иначе бы пришлось указывать конкретный тип в каждом отдельном случае.
    Ты уверен что надо указывать конкретный тип?

    fwrite сохраняет строчку в файл, и все это весит в районе пары сотен байт. Очевидно же.

    Или ты о функции readfile? Она действительно настолько критична?
    По логике если картинка на своем же серваке, то эта функция просто выдает файл, как его выдает прямой запрос, а сама по себе служит как переадресовка внутри апача.

    «Если таким образом делать 2 картинки – пользователь получит только одну.» Тут совсем не понял. То есть если этот код что выше вписать два раза (с изменением исполняемых файлов конечно), то второй файл не загрузится? Всё загрузится.

    Про .htaccess во первых честно признаю, что я его использовал только при переезде сайтов. Поэтому не совсем понимаю как сделать чтобы при запросе файла zelenie_katiata.jpg он без изменения имен делал скрытую загрузку файла 1.jpg
    Ты знаешь как это сделать? Буду очень признателен. Я именно с .htaccess изначально пытался всё это проделать, но ниасилил.

  4. Slim Alex, да в изначальном переименовывании может быть смысл. Однако если делать пачку доров на одном хостинге, то этот код позволяет разным сайтам обращаться к одной и той же картинке, что в итоге позволит на этих самых картинках сэкономить место.

    PHP для скрытия связей между доменами, если вдруг и впрямь использовать общую базу 🙂

    Ну и если загружать файл с другого сайта, то такое маскирование тоже очень кстати, чтобы поисковики думали что картинка лежит на нашем сайте. Очевидно же. Или как вы предлагаете действовать, если такая задача встанет?

  5. С трудом вспомнил, где оставлял комментарий чтоб прочитать ответы 🙁 Добавь подписку на комментарии 🙂

    Про
    > Content-type: image/gif
    Да, он, условно универсальный, но если покопаться, то найдется какой-нибудь недо-браузер, который и тут споткнется. Но в 99.9% это работает без проблем.

    > Или ты о функции readfile? Она действительно настолько критична?
    Сделай, чтоб копировала с чужого сервера — увидишь насколько критично.

    > По логике если картинка на своем же серваке, то эта функция просто выдает файл, как его выдает прямой запрос, а сама по себе служит как переадресовка внутри апача.

    По логике если картинка на своем сервере то нужно ее и выдать, а не копировать ее куда-то при КАЖДОМ запросе страницы (независимо, робот это или юзер). А представь что ссылаешься на внешний сайт (другой сервер) — при каждом обращении твой сайт должен скачать картинку (а вдруг тот сайт лег? — твоя страница не создастся — выплюнет ошибку php)

    > “Если таким образом делать 2 картинки – пользователь получит только одну.” Тут совсем не понял.

    Если скрипт использовать не для 1-ой фотки а для нескольких разных — тогда либо в разные файлы сохранять ее (т.е. не 1.jpeg а каждый раз разное название) либо при первом обращении картинка сохранится, при втором — заменится. Представляй ситуацию — запросил юзер страницу, для него сгенерировалась картинка. Но до того, как браузер скачал саму картинку другой юзер открыл другую страницу, и в этот же файл 1.jpeg сохранил НОВОЕ изображение. Именно новое изображение получат оба пользователя… Если в это время третий не откроет другую страницу 😉

    Не вижу смысла в экономии места для картинок — процессорное время сейчас дороже чем место. Единственно приемлимый вариант — если картинки лежат в одной папке для нескольких сайтов, находящихся на одном сервере — тогда действительно смысл экономии на месте есть, но он не таким образом должен достигаться, а именно через .htaccess — сейчас постараюсь набросать небольшой пример.

  6. Вот такая реализация через htaccess+php:
    В корень сайта в htaccess добавляешь:
    > RewriteEngine On
    > RewriteRule ^fotki/(.*).jpeg$ /ff.php?im=$1 [L]
    там же ложишь файл ff.php следующего содержания (надеюсь в комментариях не потеряеется тег ?php):

    В корень DOCUMENT_ROOT-а добавляешь папку tempimg, куда кидаешь нумерованные картинки.

    Теперь при обращении:
    > site.ru/fotki/ui-bg_flat_0_aaaaaa_40x100.jpeg
    Пользователю скрипт автоматически будет возвращать 1.png, при этом не перезаписывая файлы каждый раз, в самих страницах следует давать только ссылку на эту картинку, никаким кодом обрабатывать не нужно.

  7. таки съел php код 🙂 попробую по-другому:
    <?php
    $m[«ui-bg_flat_0_aaaaaa_40x100»]=’1.png’;
    $m[«ui-icons_cd0a0a_256x240»]=’2.png’;
    header(«Content-type: image/gif»);
    readfile($_SERVER[«DOCUMENT_ROOT»].’tempimg/’.$m[$_GET[«im»]]);
    ?>

  8. По сути разницы то мало..
    Обращение к картинке переадресовывается к пшп файлу, который так же как и у меня загружает картинку.

    Разве что у тебя хранится в одном скрипте все, а у меня для каждой картинки свой маленький файл. Так что тут еще не ясно что лучше каждый раз обрабатывать большой скрипт, или загружать конкретный но весящий 150-200 байт.

    Но все равно спасибо.

  9. Во-первых, посмотри, что тебе нужно для внедрения картинки на сайт? У меня достаточно написания тега
    <img src=»/fotki/а-тут-любое-название-картинки-пофиг-на-символы.jpeg»>

    При этом операций сохраниения файлов не будет-сравни сам скорости сохранения и скорости чтения, увидишь, что лучше.

    Можно сделать, чтоб файл был не большим, если условиться, что имена картинок, которые будет получать пользователь будут такого вида:

    N-тут-название-любое.jpeg

    Где N-число, номер картинки. Тогда массива соответствий не нужно — достаточно преобразования в htaccess:

    > RewriteRule ^fotki/([0-9]+)(.*).jpeg$ /ff.php?im=$1 [L]

    и изменить php так:

    <?php
    header(”Content-type: image/gif”);
    readfile($_SERVER[«DOCUMENT_ROOT»].’tempimg/’.(int)$m[$_GET[«im»]]);
    ?>

    Все, теперь для картинок будет загружаться правильная «внутренность» в зависимости от названия, при этом массив названий не нужен.

  10. Ну вот вариант N-тут-название-любое.jpeg уже интересен.
    На этом же можно и просто ЧПУ построить без особых усилий.

    При чем номер картинки можно отделять слешем, будто это папка :))
    Сейчас исправлю ошибки и в пост добавлю. И ссылку в благодарность поставлю. 🙂 Уже во второй раз :))

  11. Ну если отделять слешем, то лучше, мне кажется, прямо к папке fotki цифру дописывать:
    > RewriteRule ^fotki-([0-9]+)/(.*).jpeg$ /ff.php?im=$1 [L]
    И имя картинки будет
    /fotki-1/а-тут-любое-название-картинки-пофиг-на-символы.jpeg
    /fotki-2/тут-еще-одно-название.jpeg

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Спoнcopcкиe ссылки