Рассмотрим ситуацию, когда необходимо организовать отдачу изображений с сервера пользователю скажем «интеллектуально», об этом подробнее. Так сложилось, что привычным образом файлы изображений мы храним на сервере, в какой либо публичной директории, а на самих веб-страницах мы передаем изображения по прямым ссылкам. Т.е. мы берем ссылку на изображение, вбиваем её в браузер, получаем изображение по прямой ссылке.
Проблема в том, что для некоторых проектов не допустимо, к примеру, получения доступа к изображениям не авторизованным пользователям, либо нет возможности разграничить права доступа к файлу по ссылке. Так же не редки случаи, когда в зависимости от запроса необходимо выполнить какие-либо манипуляции с файлом или базой данных на сервере, либо как-то ещё, придерживаясь требуемых задач по проекту.
Допустим, если я авторизовался на сайте, у меня есть какая-либо ссылка, по открытию которой я получаю файл изображения — ссылка работает, я делаю выход из системы авторизации — то ссылка не работает соответственно.
Благодаря возможности использования скриптов в качестве обработчиков запроса мы можем гибко манипулировать данными, отдаваемые пользователю. Как известно протокол HTTP для своего должного функционирования обмена данными использует заголовки запросов и ответов. В этих заголовках так же наряду с другими параметрами передаются данные о типе данных передаваемые браузеру. Посылая необходимые заголовки ответа, мы можем из скрипта вернуть данные в удобоваримом формате.
Теперь о самой логике. Непосредственно сами файлы после загрузки на сервер мы можем хранить в отдельной закрытой директории, либо в базе данных в бинарном виде. Отдавать файлы можно посредством скрипта, в своем роде это напоминает концепцию единой точки входа, передавая ему параметр, указывающий на конкретный файл. В этом файле скрипте можно сделать всё что угодно, как говорилось ранее, проверить авторизацию пользователя, записать информацию о запросе, сделать временной интервал, в течении которого можно получать конкретный файл, и т.д.
Пример. Предположим, у нас есть файл обычный файл – изображения, который лежит на сервере, путь к нему таков:
./images/my_image.jpeg
Доступ к директории /images для браузеров закрывается соответственно, сделать это можно привычно через .htaccess. Получать изображения мы будем через скрипт, прозовем его getimage.php.
<?php # Обязательный параметр id, ключ файла if (!isset($_GET['id'])) die; # Здесь можно разместить код # для проверки и авторизации т.д. # Данные файла (на практике можно хранить в базе) $arFiles = array( 'my_file' => array( 'path' => './images/my_image.jpeg', 'type' => 'image/jpeg' ); ); # Проверяем наличие нужного ключа в массиве if (array_key_exists($_GET['id'],$arFiles)){ # отдаем файл header("Content-type: ".$arFiles[$_GET['id']]['type']); readfile($arFiles[$_GET['id']]['path']); } else { # файла нет header("HTTP/1.0 404 Not Found"); die; } ?>
Запрос файла мы можем произвести в браузере таким образом:
getimage.php?id=my_file
Произойдет следующее, в массиве $arFiles будет произведен поиск элемента с ключем my_file, в случае успеха в качестве ответа посылается изображение, в противном случае последует заголовок 404 Not Found.