Хостинг для настоящих Митьков

Устраиваем бесплатное файлохранилище для платного хостинга

Вступление
У нас есть платный хостинг и платим мы за него примерно 5 
американских рублей в месяц. Места на сервере, конечно, выделили 
не так много, как хотелось, а разместить там хочется ой как много! 
Выход есть, и это – narod.ru :). 

Что за система?
Конечно, на народе мы разместим весь нужный софт, поскольку 
ам нам дадут неограниченное пространство, а потом напишем 
хитроумную систему, которая будет лежать у нас на платном хостинге. 
С помощью этой системы любой юзер сможет скачивать наши файлы, 
а ссылки будут вести на платный хостинг и выглядеть они будут так: 
http://site.ru/download/download.php?id

Система будет состоять из четырех файлов: 
1. Скрипт добавления софта (add.php)
2. Скрипт скачки (download.php)
3. Форма для добавления софта (form_add.php)
4. Скрипт, отображающий софт, который мы добавили (index.php)

Принцип работы
Системы очень прост. С помощью скрипта мы добавляем в таблицу 
имя сервера, имя файла и его описание. Скрипт скачки же 
просто-напросто выдирает из таблицы данные, соответствующие 
номеру id, который передается из скрипта методом GET и 
перенаправляет браузер на софт по этим данным.
Система использует базу данных MySQL, так что приконнектимся к 
мускулу и выполним простой запрос (листинг 1).

Листинг 1:
CREATE TABLE `download` (
`uid` int(11) NOT NULL auto_increment,
`file` text NOT NULL,
`server` text NOT NULL,
`ops` longtext NOT NULL,
`click` int(11) NOT NULL default '0',
PRIMARY KEY (`uid`)
) TYPE=MyISAM;

Этим запросом мы создаем таблицу download.
Поля и их описания в этой таблице:

- uid – уникальный номер файла;
- file – имя файла;
- server – имя сервера;
- ops – описание файла;
- click – количество скачиваний этого файла.

[начинаем кодить] В скрипте form_add.php будет форма добавления 
нового софта. Эта форма будет передавать данные скрипту add.php, 
в качестве метода отправки данных в ней мы будем использовать GET. 
Сами же данные - это имя сервера, имя файла и описание этого файла, 
т.е. в скрипте мы пишем следующие поля:

<input type=text size0 name=filen> - сюда будем вводить имя файла;
<input type=text size0 name=server> - сюда имя сервера;
<input type=text sizeЂ name=ops> - сюда описание самого файла.

Например, мы закачали файл linux.rar на сайт http://mysite.narod.ru. 
Отсюда следует, что в поле File name мы должны ввести linux.rar, а в 
поле Server name - http://mysite.narod.ru/ 
Однако, можно и не писать в конце имени сервера знак прямого 
слэша «/», тогда придется добавлять его в скрипте, который помещает 
все данные в таблицу (add.php), т.е. вместо этой строки
 $put = "$server$file"; надо написать $put = "$server/$file"; 
описание этого скрипта смотри ниже. В файле add.php мы соединяемся 
с базой данных MySQL, потом проверяем все передаваемые параметры 
на пустые строки и если все нормально, то добавляем эти переменные 
в таблицу, пишем так: 
mysql_connect($host,$user,"$password"); - здесь $host - имя сервера MySQL; 
$user - имя пользователя базы данных; $password - пароль этого 
пользователя. 
Все эти переменные объявляем в начале скрипта. Далее выбираем базу 
данных, в которой лежит созданная нами таблица download:
@mysql_select_db($base) or die("Base Error"); $base - в этой переменной 
хранится имя базы, ее так же объявляем в начале.
После этого мы просто обязаны сделать проверку на пустые строки, 
описывать, как это делать я не буду (можно посмотреть в исходнике 
на диске). Ну и после проверки, если все нормально, добавляем наши 
данные в таблицу:
mysql_query("insert into download values('', '$filen', '$server', '$ops','0')");
В этом скрипте нужно обязательно добавить проверку на расширение 
закачиваемых файлов, т.е. скрипт должен фильтровать все файлы с 
расширениями *.php; *.php3;*.html;*.htm и т.д., но если этим скриптом 
будет пользоваться только админ, то никакой фильтрации писать и не 
надо. Можно вообще пойти простым путем и сделать фильтрование так, 
чтобы скрипт принимал только расширение *.rar, так будет намного проще. 
Ах да, здесь нужно добавить еще одну фильтрацию на спецсимволы 
в переменных: $filen, $server $ops.
Теперь рассмотрим стартовую страницу. На ней будут выводиться 
ссылки и описания всех файлов, что мы добавили. Принцип работы 
скрипта похож на работу предыдущего скрипта. Мы также соединяемся 
с MySQL, но только вместо добавления в таблицу инфы, мы эту инфу 
извлекаем и выводим на экран.

Листинг2:
..здесь соединяемся с MySQL...
print "<body bgcolor=000000 link=orange alink=orange vlink=orange textяffff>";
print "<center><div styleєckground-color:orange;color:000000>Best soft</div></center>";
….

Теперь нам надо взять всю инфу из таблицы, т.е. мы выполняем такой 
запрос:
$re=mysql_query("select * from download order by uid desc");
Возникает законный вопрос – а что же такое desc? Рассказываю: это 
нужно для того, чтобы тот файл, который добавлен последним, 
был в списке вывода первым.
А дальше все просто, мы перебираем весь архив и выводим его на 
нашу страничку (листинг 3).

Листинг 3:
while($res=mysql_fetch_array($re)) 
	{
		print "<div style='border-left: 1px orange solid;border-right: 1px orange 
solid;border-bottom: 1px orange solid;padding:6px'>
		<a href='download.php?id=$res[uid]'><b>$res[file]</b></a>
		<div class=tekst>$res[ops]<br>
		Скачиваний: ($res[click])<br>
		</div></div>";
	}

При клике на ссылку, скрипту download передается параметр id и 
скрипт выдирает из таблицы всю нужную информацию.
В скрипте download.php как всегда соединяемся с MySQL и выполняем 
запрос точно такой же, как и в предыдущем скрипте, но здесь уже 
необязательно писать desc. Далее, опять перебираем весь полученный 
массив и сравниваем переменную $id, полученную из стартовой 
страницы, и $res[uid] - это уникальный идентификационный номер 
каждой программки. Если они совпадают, то число, стоящее в таблице 
в поле click мы увеличиваем на 1 (поле click отвечает за число 
скачиваний, если ты не забыл), потом просто делаем перенаправление 
на сгенерированный из таблицы адрес (листинг 4).

Листинг 4:
while($res=mysql_fetch_array($re)) 
	{
		$click = $res[click];// В этой переменной хранится количество скачиваний
		if ($id == $res[uid])// Проверяем совпадение id из формы и uid из таблицы
			{	
				$file = $res[file];
				$server = $res[server];
				$put = "$server$file";// Генерим адрес программы
				$click = $click + 1;
				mysql_query("UPDATE download SET click=$click WHERE 
uid=$id");
				header("location:$put");// А здесь перенаправляем
			}
	}

Есть и один минус
Этой системы, который не каждый заметит – это то, что при клике на 
ссылку появляется стандартное окно закачки и в нем в поле источник 
будет написан истинный адрес сервера – откуда юзер качает файл. 
Но если пользоваться утилитой типа Flash Get, то там кроме имени 
закачиваемого файла больше ничего не увидишь. Вот и все, надеюсь, 
всех тех, кто хочет экономить на хостинге, эта статья заинтересовала.
 Кстати, для хранения софта лучше пользоваться бесплатным 
хостингом www.h1.ru