ASP shelf

Универсальный самообучающийся загрузчик

Легко ли скачивать файлы? Ох как трудно!
Казалось чего бы проще - поставил ссылку на файл и бывай здоров. Однако стойте! Не все так просто.

Тут как-то на досуге занимался я деланием музыки. (Ну в смысле пытался заниматься). Вобщем решил я сделать под это дело небольшую персональную страничку, куда выложил свои нетленки. Да вот встал вопрос: а кто же их будет качать и как я узнаю, сколько человек их скачало, какая самая популярная и т. п.

И дело все в том, что не я один задумывался над этим вопросом. Всюду вы можете видеть при попытке чего-нибудь скачать, надписи типа "Подождите пять минут, пока не началась загрузка..." Раздражает, не правда ли? Теперь у вас появилась уникальная возможность отомстить всему роду человеческому и сделать на своем сайте такую-же вредную табличку!

Так как я предусмотрительно разместил свою "музыкальную" страничку на сервере Brinkster с поддержкой ASP, то не долго думая сварганил ASP-скрипт, который подсчитывал мне статистику загрузок с сайта. В чем прелесть этого скрипта - он самообучающийся, то-есть вам надо только указать корень, в котором лежат файлы, а затем передавать скрипту имена файлов. И все. Новые имена будут автоматически заноситься в базу, а у старых счетчик будет потихоньку тикать. Вы можете просматривать статистику, удалять записи и вручную заводить новые.

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

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

Вторая часть является "админской" и предназначена в первую очередь для вас. Во-первых, она должна быть защищена паролем, а во-вторых, она должна показывать статистику.

Начнем написание с создания базы данных. Назовем ее download.mdb Структура базы такова:

table: Downloads
dID Long - Auto increment В принципе, бесполезная вещь, но я оставил ее
dName Text - 250 Под имя файла. (...места не жалко :)
dCount Long Собственно, сам счетчик

Надеюсь, вы разобрались. Естесственно, пароль на базу - за вами.

Приступаем к написанию "клиентской" части. Она будет находиться в файле download.asp

<html>
<head>
<title>Download file</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<style type="text/css">
<!--
p { font-family: Arial, Helvetica, sans-serif; font-size: 12pt; color: #000000}
table { font-family: Arial, Helvetica, sans-serif; font-size: 10pt; color: #000000}
a { font-family: Arial, Helvetica, sans-serif; color: #000099; text-decoration: none}
h1 { font-family: Arial, Helvetica, sans-serif; color: #000099; font-size: 16pt}
-->
</style>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<%
DownloadRoot="./files/" 'Это корень, где лежат файлы
DownloadFile=request("id") 'Какой файл качать сейчас
DownloadUrl=DownloadRoot & DownloadFile 'Полный путь файла

'Строка подключения
strDSN="DRIVER=Microsoft Access Driver (*.mdb);UID=admin;DBQ=" & Server.MapPath("download.mdb")

'Создадим подключение
set myDB=Server.CreateObject("ADODB.Connection")
myDB.Open strDSN

'Откроем таблицу с записями
set rsDownload=Server.createObject("ADODB.Recordset")
strFndRec="SELECT dCount FROM Downloads WHERE dName='" & DownloadFile & "'"
rsDownload.Open strFndRec, strDSN

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

if rsDownload.EOF and rsDownload.BOF then
'Добавлять новое имя для Download'а
myDB.Execute "INSERT INTO Downloads (dName, dCount) VALUES ('" & DownloadFile & "', 0)"
end if

Теперь мы увеличим счетчик, покажем уведомление о загрузке (с парочкой баннеров!)

'Увеличивать счетчик
cmdDownload.Execute "UPDATE Downloads SET dCount=dCount+1 WHERE dName='" & DownloadFile & "'"
cmdDownload.Close
set rsDownload=Nothing
set cmdDownload=Nothing

'Показать уведомление о начале загрузки
response.write "<h1 align=center>Загрузка файла</h1><p align=center>Подождите чуть-чуть и загрузка начнется</p>"
response.write "<p align=center>Если ничего не происходит, щелкните здесь<br><br>"
response.write "<a href='" & downloadUrl & "'><b>" & downloadUrl & "</b></a></p>"
response.write "<p align=center>Спасибо, что загрузили этот файл!</p>"

'Теперь направить юзеров на файл для Download'a
%>
<SCRIPT Language=JScript>
window.navigate ("<%= DownloadUrl %>")
</SCRIPT>
</body>
</html>

Все! После вызова сего скрипта например таким образом: download.asp?id=test.zip юзеру будет выдан файл <site root>/files/test.zip

Теперь напишем "админскую" часть. Файл download_stats.asp

<html>
<head>
<title>Загрузки с сервера</title>
<style type="text/css">
<!--
p { font-family: Arial, Helvetica, sans-serif; font-size: 10pt; color: #000000}
table { font-family: Arial, Helvetica, sans-serif; font-size: 10pt; color: #000000}
a { font-family: Arial, Helvetica, sans-serif; color: #000099; text-decoration: none}
-->
</style>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body bgcolor="#ffffff" text="#000000">
<%
strDSN="DRIVER=Microsoft Access Driver (*.mdb);UID=admin;DBQ=" & Server.MapPath("download.mdb")

'Открыть подключение
Set myDB=server.createObject("ADODB.Connection")
myDB.open strDSN

'Открыть таблицу с записями
Set rsDownload=server.CreateObject("ADODB.Recordset")
strFndRec="SELECT * FROM Downloads"
rsDownload.Open strFndRec, myDB

Теперь просто выписываем всю статистику, оформленную в табличке

if rsDownload.EOF And rsDownload.BOF then
response.write "Записей нет"
else
Response.Write "<h2 align=center>Статистика загрузок с сайта</h2>"
Response.Write "<table border=1 align=center width=90% ><tr><td>"
Response.Write "<table width=100% align=center border=0 ><tr bgColor=#87CEFA><b><td width='5%'><b>ID:</b></td><td width='85%'><b>Name:</b></td><td width='7%'><b>Count:</b></td width=3% ><td>&nbsp;</td></tr>"
do while not rsDownload.EOF
Response.Write "<tr bgColor=#E6E6FA>"
response.write "<td width='5%'>" & rsDownload("dID") & "</td>"
response.write "<td width='85%'>" & rsDownload("dName") & "</td>"
response.write "<td width='7%'>" & rsDownload("dCount") & "</td>"
Response.Write "<td width='3%'><a href=download_util.asp?todo=del&id=" & rsDownload ("dID") & ">-</a></td>"
response.write "</tr>"
rsDownload.MoveNext
loop
Response.Write "<tr bgColor=#E6E6FA><form action='download_util.asp' method=POST>"
Response.Write "<input type=hidden name=todo value=add>"
response.write "<td width='5%' align=right>-></td>"
response.write "<td width='85%'><input name='dName' style='width:100%; background-color:#F5F5FA '></td>"
response.write "<td width='7%'><input name='dCount' style='width:100%; background-color:#F5F5FA '></td>"
Response.Write "<td width='3%'><input type=submit value='+' style='height:20px; cursor=hand; BACKGROUND-COLOR: #f5f5f9; BORDER-BOTTOM: 1px solid; BORDER-LEFT: 1px solid; BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid'></td>"
response.write "</form></tr>"

Response.Write "</table>"
Response.Write "</td></tr></table>"
end if
rsDownload.close
Set rsDownload=Nothing
Set myDB=Nothing
%>
<p align=center><A href="default.asp"><b>На главную страницу</b></A></p>
<p><blockquote><font size=1 face=Arial><b>(c)2000 Anti' Studios.</b></font></blockquote></p>
</body>
</html>

Вроде все. В качестве домашнего задания вам сделать удаление записей из таблицы статистики и добавление туда новых вручную. Все необходимое в списке статистики для этого я подготовил.

Приятного программирования, Antiloop