Наверное каждому приходилось сталкиваться с временными ссылками при скачивании фильмов, музыки, программ и т.п. Зачем это делается? Да чтобы другие сайты не размещали ссылки на файлы, которые расположены на нашем сайте. Давайте посмотрим, как написать скрипт, который будет генерить временные ссылки. В качестве хранения информации о файлах и временных ссылках, будем использовать БД. Таблица files хранит информацию о файлах:
Code
CREATE TABLE `files` ( `id` INT(10) PRIMARY KEY, `title` VARCHAR(255) NOT NULL DEFAULT '', `description` TEXT NOT NULL DEFAULT '', `filename` VARCHAR(64) NOT NULL DEFAULT '', `mimetype` VARCHAR(8) NOT NULL DEFAULT '' ) ENGINE=INNODB DEFAULT CHARSET=cp1251;
Здесь
id - уникальный ID файла
title - название файла, например, “Текстовой редактор NotePad++“
description - описание файла, например, “Бесплатный редактор текстовых файлов (замена стандартного Блокнота) с поддержкой синтаксиса большого количества языков программирования, ориентирован для работы в операционной системе MS Windows“
filename - имя файла для скачивания, например, NotePadPP.zip
mimetype - MIME-тип файла
Таблица downloads хранит информацию о временных ссылках:
Code
CREATE TABLE `downloads` ( `file_id` INT(10) NOT NULL DEFAULT 0, `uniq_id` VARCHAR(32) NOT NULL DEFAULT '', `puttime` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=INNODB DEFAULT CHARSET=cp1251;
Здесь
file_id – уникальный ID файла
uniq_id – временная ссылка
puttime - время создания ссылки
Файлы для скачивания расположены в директории DOCUMENT_ROOT/download/files/. Эта директория должна быть защищена с помощью .htaccess:
Code
Order Allow,Deny Deny from All
Скрипт, который будет выполнять всю работу - выводить список файлов, генерить временные ссылки, и отдавать файлы на скачивание - DOCUMENT_ROOT/download/index.php
switch( $action ) { case 'fileslist': // список файлов для скачивания fileslist(); break; case 'getlink': // создаем временную ссылку getlink(); break; case 'download': // отдаем файл на скачивание download(); break; }
function fileslist() {
echo '<h3>Файлы для скачивания</h3>'."\n"; $query = 'SELECT id, title, description, mimetype FROM `files` WHERE 1 ORDER BY title'; $res = mysql_query( $query );
// если не передан уникальный ID файла - значит пользователь попал сюда по ошибке if( !isset( $_GET['id'] ) ) { header( 'Location: '.$_SERVER['PHP_SELF'].'?action=fileslist' ); die(); } $id = (int)$_GET['id'];
// прежде чем генерить временную ссылку, проверяем, что есть такая запись в таблице БД $query = 'SELECT 1 FROM `files` WHERE id='.$id; $res = mysql_query( $query ); if( mysql_num_rows( $res ) == 0 ) { header ( 'HTTP/1.1 404 Not Found' ); die(); }
$link = $_SERVER['PHP_SELF'].'?action=download&id='.$id.'&code='.$uniq_id; echo '<p>Для загрузки файла перейдите по <a href="'.$link.'">этой ссылке</a>. '; echo 'Ссылка действительна в течение 12 часов.</p>'."\n";
}
function download() {
// если не передан уникальный ID файла - значит пользователь попал сюда по ошибке if( !isset( $_GET['id'] ) ) { header( 'Location: '.$_SERVER['PHP_SELF'].'?action=fileslist' ); die(); } $id = (int)$_GET['id'];
// если файла нет if( !file_exists( './files/'.$filename ) ) { header ( 'HTTP/1.1 404 Not Found' ); die(); }
// получаем размер файла $fsize = filesize( './files/'.$filename ); // дата модификации файла для кеширования $ftime = date( 'D, d M Y H:i:s T', filemtime( './files/'.$filename ) ); // смещение от начала файла $range = 0;