ASP shelf
Легко ли скачивать файлы? Ох как трудно!
Казалось чего бы проще - поставил ссылку на файл и бывай здоров. Однако стойте!
Не все так просто.
Тут как-то на досуге занимался я деланием музыки. (Ну в смысле пытался заниматься). Вобщем решил я сделать под это дело небольшую персональную страничку, куда выложил свои нетленки. Да вот встал вопрос: а кто же их будет качать и как я узнаю, сколько человек их скачало, какая самая популярная и т. п.
И дело все в том, что не я один задумывался над этим вопросом. Всюду вы можете видеть при попытке чего-нибудь скачать, надписи типа "Подождите пять минут, пока не началась загрузка..." Раздражает, не правда ли? Теперь у вас появилась уникальная возможность отомстить всему роду человеческому и сделать на своем сайте такую-же вредную табличку!
Так как я предусмотрительно разместил свою "музыкальную" страничку на сервере Brinkster с поддержкой ASP, то не долго думая сварганил ASP-скрипт, который подсчитывал мне статистику загрузок с сайта. В чем прелесть этого скрипта - он самообучающийся, то-есть вам надо только указать корень, в котором лежат файлы, а затем передавать скрипту имена файлов. И все. Новые имена будут автоматически заноситься в базу, а у старых счетчик будет потихоньку тикать. Вы можете просматривать статистику, удалять записи и вручную заводить новые.
В конечном счете, это будет даже не скрипт, а набор для ведения статистики загрузок, состоящий из несколько ASP-скриптов.
Первая часть, как вы можете догадаться, является "клиентской", в том смысле что она показывает юзеру ту самую вредную надпись "Подождите...", причем обязательно с кучей баннеров, и выводит его на файл, а пока он чешет в затылке, заносит одну "загрузку" на счет записи в базе данных.
Вторая часть является "админской" и предназначена в первую очередь для вас. Во-первых, она должна быть защищена паролем, а во-вторых, она должна показывать статистику.
Начнем написание с создания базы данных. Назовем ее
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> </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