PHP скрипт скачивания файлов по временным ссылкам
Временные ссылки на php. Что это такое и с чем их едят? Все очень просто. Часто при построении какого-либо php движка возникает необходимость размещения на страницах сайта, которым будет управлять этот движок, ссылок на скачивание различных архивов с программами, изображениями, шаблонов сайтов и т. п. В простейшем случае все это можно снабжать прямыми линками на архивы, а сами архивы размещать в незащищенной папке своего домена. Но такой путь не совсем верный. Во-первых, линки на архивы могут быть скопированы на другие ресурсы и скачивать их можно будет даже не заходя на ваш сайт. Во-вторых, из-за того, что файлы будут размещены в незащищенной папке они могут быть повреждены или даже стерты злоумышленниками.
Поэтому наилучший способ, это отдавать линки на скачивание архивов с сайта по так называемым временным ссылкам формируемым средствами PHP. Архивы при этом могут быть запрятаны в любую папку любой директори сайта и защищены от постороннего доступа файлом .htaccess.
Каков же механизм формирования временных ссылок? Необходимо создать базу с двумя таблицами. В первой будут находиться уникальные названия файлов для скачивания с их атрибутами — расширение, описание, и т. п. В другой будут создаваться временные строки с уникальными названиями файлов, случайный хеш и время создания записи. Строки второй таблицы должны формироваться при переходе на страницу для скачивания файла. И какраз на базе второй таблицы и будут формироваться временные линки на скачивание которые будут содержать в себе случайный хеш.
Задача php обработчика для формирования временной ссылки состоит в нахождении во второй таблице строку с хешем присутствующим в линке и извлечь из этой строки id архива на скачивание, по которому затем в базе названий архивов можно найти название нужного архива и отдать его на скачивание пользователю.
Это можно организовать с использованием базы MySQL. Но если база файлов небольшая то выгоднее это сделать на обычных текстовых файлах, один из которых будет являться базой из названий архивов и их атрибутов , а другой вместилищем для временных линков. Такой механизм работает на ресурсе ‘Электроника программированиесайтостроение’ php, html, css для любителей и профессионалов в разделе ‘Шаблоны сайтов’, который выполнен на базе CMS упомянутой в статье про поисковую статистику. Допустим у нас есть два текстовых файла
// файл-база для названий файлов
$namefiles = «namefiles.dat»;
// файл-база для временных ссылок
$templinks = «templinks.dat»;
Первый — это база с названиями файлов в котором могут быть строки каждая из которых имеет записи разделенные знаком ‘/’. Ясно что первая запись в строке это уникальный id файла, вторая это его описание, третья — название архива
001/Шаблон сайта ultra 77/templates1.rar
002/Шаблон сайта от Open Designs/templates2.rar
Второй — это файл для временных линков, которые будут туда записываться в строку. Строка будет содержать три поля разделенные все тем же знаком ‘/’, первое — уникальный id файла, второе — случайный хэш и третье — время формирования строки. Ну а скрипт формирования временных линков, назовем его например templinks.php, должен состоять из трех частей. Первая из них это очистка файла временных линков с просроченным временем существования. Выглядит это примерно так:
// сколько хранить ссылки (в секундах — 10 минут)
$hardtime = 600;
// текущее время в сек
$currtime = time();
// проверка и очистка временных строк
$arruniqid = file($templinks);
$newarruniqid = array();
for($i = 0; $i < count($arruniqid); $i++)
// строки таблицы временных уник. id
list($file_id,$uniq_id,$puttime) = explode(«/»,$arruniqid[$i]);
$difftime = $currtime — intval($puttime);
// если время текущей строки в пределе
if($difftime < $hardtime)
array_push($newarruniqid, «$file_id/$uniq_id/$puttime»);
>
// составить матрицу таблицы временных id
$newtbdwn = implode(«»,$newarruniqid);
$fp=$wf->fopen($templinks,»w»);
@fwrite ($fp,$newtbdwn);
fclose($fp, $templinks);
Вторая часть — это получение строки из файла базы названий файлов, соответствующей id, который передан в строке запроса файла. Например строка запроса файла выглядит так http://. /templinks.php?getlink=001
if($_GET[‘getlink’])
// матрица названий файлов
$arrtbfl = file($namefiles);
foreach($arrtbfl as $key => $val)
list($id,$descr,$filename) = explode(«/»,$val);
if($id == $_GET[‘getlink’])
list($id,$descr,$filename) = explode(«/»,$val);
$nowid = $id;
break;
>
>
// генерировать уник. id
$arrtbunq = file($templinks);
$uniq_id = md5( uniqid(rand(), 1) );
array_push($arrtbunq, «$nowid/$uniq_id/$currtime\n»);
// новая строка уник. id
$newtbunq = implode(«»,$arrtbunq);
// записать файл базы обратно
$fp=fopen($templinks,»w»);
@fwrite ($fp,$newtbunq);
fclose($fp,$templinks);
// Ссылка для скачивания
$shlink = «href=http://. /templinks.php?download=$uniq_id»;
>
Третья часть — это переход по сформированному временному линку для скачивания нужного файла. Для этого нужно пройтись по базе временных линков и найти какой строке базы соответствует наличие там $uniq_id чтобы потом пройдясь по базе файлов найти там название архива соответствующее найденному в базе временных линков $id.
if($_GET[‘download’])
$dwn = file($templinks);
foreach($dwn as $key => $val)
list($file_id,$uniq_id,$puttime) = explode(«/»,$val);
if(strstr($uniq_id == $_GET[‘download’])
$id = $file_id
break;
>
>
Теперь у нас есть id файла по которому можно найти название самого файла в базе namefiles.dat и отдать юзеру. Что собственно нам и требовалось.
Подведем итоги. Описанный механизм позволяет формировать ссылки с управляемым временем существования и случайным параметром запроса. Что это дает? Скачать нужный файл юзер сможет только зайдя на нужную страницу вашего сайта. Невозможно будет скачать файл с другого домена по линку сформированному на вашем сайте, поскольку он имеет конечное короткое время существования. Ну, а вобщем это полезный способ для сохранения и приумножения трафика вашего сайта.
PHP скрипт временных ссылок на текстовой базе
PHP скрипт формирования временных ссылок можно строить по разному. Например все можно сделать на базе MySQL, а можно не завязываться со сторонней базой и сформировать на PHP временные ссылки в обыкновенной текстовой базе. Базу ссылок можно сериализовать, хотя это совершенно не обязательно.
Тема временных ссылок на PHP уже рассматривалась в контексте CMS на файлах. В данном посте рассмотрен механизм формирования временных ссылок не только с конечным временем существования, но и с конечным количеством кликов по ссылке. Эта тема может быть интересна как один из вариантов построения ссылок на скачивание товара в интернет магазине цифровых товаров.
Итак суть состоит в том, что для формирования временных ссылок необходимо организовать два файла, один из которых будет содержать базу уникальных названий архивов для скачивания с их ID, в качестве ID могут быть просто уникальные числобуквенные номера архивов, а другой просто пустой файл где будут формироваться строки с уникальными номерами временных ссылок, временем их формирования и количеством запросов. Например файл-база названий архивов может выглядеть так:
001|Шаблон сайта 1|template1.rar
002|Шаблон сайта 2|template2.rar
.
Файл временых ссылок разбивается на строки, разделителем внутри строки может ыть любй малоиспользуемый символ, например — | и может быть примерно таким:
Первое в строке это уникальный ID файла (001), второе это случайный хеш для текущего файла, третье — время формирования строки, четвертое — количество запросов файла. Количество запросов файла можно увеличивать при переходе по ссылке запроса при условии совпадения хеша из строки запроса с тем, что находится в строке базы временных ссылок. При превышении количества запросов над установленным в виде константы, строка из базы временных ссылок удаляется с соответствующим собщением. Вот собственно и все. Для того, чтобы просмотреть весь механизм в деталях можно воспользоваться очередной версией Acvarif-CMS.
Все делается на локальном сервере, куда должна уже быть установлена и запущена CMS. Нужно открыть в Dreamweawer или в блокноте файлы data/php/antileech/templinks.php, data/bases/bdfiles/templinks.dat, перейти по ссылке http://acvarifcms.ru/lrub3part2/lrub3part2page1.html и обновляя страницу и кликая по ссылке «загрузка» наблюдать за тем, что происходит в файле templinks.dat (примерное ниже по тексту) одновременно анализируя PHP скрипт временных ссылок templinks.php.
lrub3part2/lrub3part2page1|e69b2ca5e9fc89b89e42245eca0697b5|1299693320|2
lrub3part2/lrub3part2page1|b9806d502ce838b13f9a7dcc107e7d9c|1299693336|1
lrub3part2/lrub3part2page1|cb32166070e2afc0cb8e2a6d22853f50|1299693346|1
lrub3part2/lrub3part2page1|1eb43658bc4c09767f208bb60051a2b6|1299693368|1
lrub3part2/lrub3part2page1|25dc0791b9dcd8ecb6098d0132dd9ce6|1299693377|6
lrub3part2/lrub3part2page1|c54835f8a482f5628836a42333cfcd1c|1299693498|2
Наличие обильных комментов полностью прояснит механизм его работы. Надеюсь данный пост послужит на пользу тем кто интересуется PHP. Вопросы и замечания через форму для комментов.
Как сделать временную ссылку на файл в PHP?
Добрый день!
Подскажите пожалуйста. Может кто знает готовый скрипт?
Нужна временная ссылка.
То есть: Есть файл, нужно чтобы ссылка на него была рандомной в виде «site.com/mnwajdkmalwadhwj.rar» и временной, допустим на 2 часа. Возможно ли такое реализовать? Если да то как?
Заранее огромное спасибо!
Простой 1 комментарий
все завсит от того будет ли делаться копия файла с рандомным именем или нет
1) Копия тут просто копируете файл в каталог с рандомным имененем и ставте крон который каждую минуту очищает дирректорию файлов дата создания старше двух часов.
2) Если нет то создаете таблицу name,hash,date при генерации ссылки заносите в таблицу соответствующие данные, потом создаете каталог для временных файлов кидаете туда htaccess. В котором будет 1 файл index.php в .htaccess. настраивается правило что любые запросы на эту дирректорию переводить на index.php.
index.php разбирает строку запроса и выделяет из нее имя файла типа
site.com/tmp_dir/mnwajdkmalwadhwj.rar,
где tmp_dir это это наша директория где лежит index.php, а mnwajdkmalwadhwj.rar наш временный файл, проверяем в таблице существует такая запись если да то формируем соответствующие заголовки читаем содержимое файла и отдаем пользователям. И так же ставим крон который по дате очищает таблицу от старых записей.
В этом нет ничего сложного или необычного — все уже изобрели до Вас.
Не виду смысла отвечать подробно ибо эту тему разобрали на хабре по косточкам от и до.
P.S. Скажу за себя — X-Accel-Redirect наше все 🙂