Статьи

Создайте скрипт загрузки файла на Perl

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

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

Помимо невежливости, это так называемое «горячее» соединение стоит мне денег, поскольку мой веб-хостинг взимает плату за используемую мной пропускную способность. Моим решением было создать Perl-скрипт для маскировки URL-адресов файлов на моем веб-сайте.

В этом уроке я покажу вам, как создать простой скрипт загрузки с использованием Perl. Пример, который мы рассмотрим, замаскирует URL-адрес загрузки, запишет каждую загрузку в файл журнала и предоставит посетителю диалоговое окно «Сохранить как…».

Требования

Чтобы этот сценарий работал, все ваши фотографии (или любые другие файлы, которые вы предлагаете для загрузки) должны находиться в одном каталоге. Сценарий также должен находиться на том же сервере, что и каталог загружаемых файлов.

Давайте начнем!

Начните свой сценарий, добавив строку shebang. Строка shebang начинается с символа фунта, за которым следует восклицательный знак и путь к интерпретатору Perl сервера. « -wT

 #!/usr/bin/perl -wT

Большинство серверов Linux / Unix имеют интерпретатор Perl в этом месте. На компьютере под управлением Windows обычная строка shebang — » #!C:perlbinperl.exe Если вы не уверены в операционной системе вашего сервера или пути к Perl, уточните у своего веб-хоста.

Следующие 2 строки указывают, что мы хотим использовать модуль CGI и что мы хотим отображать любые фатальные ошибки в окне браузера.

 use CGI ':standard'; 
use CGI::Carp qw(fatalsToBrowser);

Теперь мы объявим 3 переменные:

 my $files_location;  
my $ID;  
my @fileholder;

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

 $files_location = "/home/files/download/photos";

Если ваш сервер является машиной Windows, путь будет использовать обратную косую черту, например:

 $files_location = "C:filestodownload";
Теперь для хорошего материала

На следующей строке начинается самое интересное. Мы уже объявили переменную с именем « $ID Теперь нам нужно указать его значение. Эта переменная содержит имя файла для загрузки. Однако вместо непосредственного присвоения его значения мы хотим, чтобы его значение передавалось из браузера. Есть несколько способов передать имя файла этой переменной, но сейчас мы просто укажем, что значение будет получено из браузера. Обратите внимание, что в конце этой статьи вы сможете загрузить полный исходный код этого сценария, а также HTML-форму, которую можно использовать для вызова сценария.

 $ID = param('ID');  

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

 if ($ID eq '') {  
print "Content-type: text/htmlnn";  
print "You must specify a file to download.";  
} else {

Если указано имя файла, мы хотим открыть этот файл и назначить его содержимое временному заполнителю с именем « @fileholder Если при открытии или закрытии файла возникнут ошибки, нам нужно отобразить сообщение об ошибке.

 open(DLFILE, "<$files_location/$ID") || Error('open', 'file');  
@fileholder = <DLFILE>;  
close (DLFILE) || Error ('close', 'file');

Регистрация загрузки

Следующие 3 строки являются необязательными, но они полезны для отслеживания количества загрузок каждого файла. Эти 3 строки просто открывают файл журнала с именем « dl.log Как и прежде, вы должны указать абсолютный путь на вашем сервере.

 open (LOG, ">>/home/files/dl.log") || Error('open', 'file');  
print LOG "$IDn";  
close (LOG);

Чтобы это работало, необходимо 2 вещи. Во-первых, каталог должен уже существовать на вашем сервере. Во-вторых, файл « dl.log Чтобы изменить права доступа к файлам на сервере Linux / Unix, вы должны использовать команду chmodchmod 777 dl.log/

Отправка файла

Теперь мы хотим отправить файл пользователю. Что если файл представляет собой изображение, PDF или файл другого типа, который распознает браузер? Даже если мы замаскировали URL, браузер посетителя отобразит файл. Чтобы уговорить браузер отобразить диалоговое окно «Сохранить как…», нам нужно подделать тип файла в отправляемом заголовке:

 print "Content-Type:application/x-downloadn";   
print "Content-Disposition:attachment;filename=$IDnn";  
print @fileholder  
}
Некоторая обработка ошибок

Мы поручили сценарию вызвать подпрограмму, если что-то пойдет не так, когда файл открывается или загрузка записывается в файл журнала. Следующий раздел кода отображает ошибку в окне браузера:

   sub Error {  
       print "Content-type: text/htmlnn";  
   print "The server can't $_[0] the $_[1]: $! n";  
   exit;  
 }
Выполнено! Но как это работает?

Чтобы проверить это, загрузите скрипт в каталог cgi-bin и выполните команду chmod на 755.

Теперь, как мы называем этот сценарий? Есть несколько способов сделать это. Во-первых, вы можете создать на своей веб-странице гиперссылку следующего содержания:

 <a href="/cgi-cin/script.cgi?ID=file.zip">Download File</a>

Или вы можете создать форму, которая включает поле (флажок, раскрывающееся меню и т. Д.) С именем ID и действие: <http://www.yourserver.com/cgi-bin/script.cgi> /cgi-bin/script.cgi

Исходный код

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

 <html><head>  
<title>Download Page</title>  
</head>  
<body>  
<form action="/cgi-bin/script.cgi">  
<p>  
 <select size="1" name="ID">  
 <option value="0001.jpg">File One  
 </option>  
 <option value="file.zip">File Two  
 </option>  
</p>  
 </select>  
<input type="submit" value="Submit" name="B1">  
</form>  
</body>  
</html>

Вот полный сценарий:

 #!/usr/bin/perl -wT  
 
use CGI ':standard';  
use CGI::Carp qw(fatalsToBrowser);  
 
my $files_location;  
my $ID;  
my @fileholder;  
 
$files_location = "/usr50/home/webdata/photos";  
 
$ID = param('ID');  
 
if ($ID eq '') {  
print "Content-type: text/htmlnn";  
print "You must specify a file to download.";  
} else {  
 
open(DLFILE, "<$files_location/$ID") || Error('open', 'file');  
@fileholder = <DLFILE>;  
close (DLFILE) || Error ('close', 'file');  
 
open (LOG, ">>/usr50/home/webdata/public_html/test.log") || Error('open', 'file');  
print LOG "$IDn";  
close (LOG);  
 
print "Content-Type:application/x-downloadn";  
print "Content-Disposition:attachment;filename=$IDnn";  
print @fileholder  
}

Не забудьте скачать код полностью!