Яндекс цитирования
 

CGI/PERL : практика программирования

 

[ В начало раздела ]

Создание и управление архивом файлов вашего сайта

Иногда у вебмастера встает задача предоставить посетителям сайта различные программы, пакеты, одним словом, - скачать. Эту задачу можно решить просто - создаем ссылку на этот файл или пакет и забываем об этой проблеме.

Через некоторое время все же захочется узнать, сколько раз скачивали тот или иной файл, тем самым получив информацию о посещении сайта посетителями и их заинтересованности в предоставляемой вами информации.

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

Во-первых, определимся с методом работы такого скрипта. Ссылка на файл, который надо предоставить пользователю, передает имя файла, например,

http://anysite/cgi-bin/archive.pl?file=anyfile

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

Имя файла>>Счетчик>>Краткое описание>>
Подробное описание

Как файл передать пользователю так, чтобы появилось окно "Сохранить как"? Тут весь фокус в том, чтобы подсунуть браузеру тот тип файла, который он не знает, тогда он спросит о его сохранении у пользователя. Я использую типы zip или bin.

Передать файл в браузер можно с помощью инструкции:

Print "Location: файл\n\n";

Счетчик числа скачиваний файла работает по протоколу SSI. Например, чтобы вывести число скачиваний файла Anyfile, в HTML-страницу вставляем инструкцию:

<!--#include virtual="/cgi-bin/archive.pl?count=anyfile" -->

Алгоритм работы скрипта прост: При получении команды, решается, скачивать файл (file) или показать счетчик (count). Просматривается файл репозитария, находим нужную строчку в файле, разбираем ее. Если скачивается файл, счетчик увеличивается, файл репозитария переписывается.

Теперь поговорим о настройках скрипта. Директорию, где хранятся файлы архива храним в переменной $ARCHIVE_DIR. Общее расширение для файлов - в переменной $FILEEXT.

Вот что у нас получилось в итоге.

#!/usr/local/bin/perl

$HOME_DIR = "/home/d/dolgov.hut.ru/"; $SCRIPT_DIR = $HOME_DIR . "cgi/"; $ARCHIVE = $HOME_DIR . "WWW/archive.txt"; $ARCHIVE_DIR = "/archive/"; $FILEEXT = "bin";

require $SCRIPT_DIR."parsform.pl"; require $SCRIPT_DIR."template.pl";

#################################################################### # получаю список параметров из входного потока if ($ENV{'QUERY_STRING'}) { # устанавливаем REQUEST_METHOD и разбираем данные. $ENV{'REQUEST_METHOD'} = "GET"; &parse_form; } # число скачиваний файла elsif($FORM{'count'} ne "") {

open(DATABASE, $ARCHIVE) || die "cannot open $ARCHIVE"; $dcount = 0; while (<DATABASE>) { if(/^$FORM{'count'}>>/) { ($filename,$dcount) = split(/>>/, $_); # разбор параметров файла last; } } close(DATABASE); print "Content-type: text/html \n\n"; print "<b><font color=#000080>Скачиваний: $dcount</font></b>"; } else { &download_file("$FORM{'file'}"); # скачиваю файл }

#################################################################### # функция скачивания файла пользователю #################################################################### sub download_file { $getfile = shift; # получаю параметр - имя файла $filenames = "../$ARCHIVE_DIR".$getfile.".".$FILEEXT; # путь к файлу

# открываю файл описаний архива open (download, $ARCHIVE) || die "Cannot open basefile $ARCHIVE"; @myfile = <download>; close (download);

# инициализация переменных $isfind = 0; $count = 0; $record = 0;

# начинаю работать с файлом построчно foreach $temp (@myfile) { if ($temp =~ /^$getfile/) { ($fn,$count,$tit) = split(/>>/,$temp); # увеличиваю счетчик и замещаю строчку в файле $count++; $myfile[$record] = sprintf("%s>>%d>>%s>>\n",$fn,$count,$tit); $isfind = 1; last; } $record++; # счетчик строк файла описания }

# если успешно, записываю обновление if ($isfind eq 1) { open (download,">$ARCHIVE"); seek (download,0,0); print (download @myfile); close (download); # !!! основная строка - вывод файла пользователю print "Location: $filenames\n\n"; }

exit; }

####################################################################

Все! Скрипт построен, готов к употреблению.

© Долгов С.В. 19.05.01

!!! СКАЧАТЬ СКРИПТ !!!

 

[ В начало раздела ]


 

 

Все для web-дизана!!! Бард-Путеводитель Много Всего CGI-Гид. Лучшие скрипты... WDH - WebDesignHelp - CGI, JAVA, APPLETS, TOP100! Раскрутка, увеличение посещаемости и индекса цитируемости в поисковых системах.

© 2000-2002 Долгов Сергей

dolgov_sergei@mail.ru

X