Многие браузеры предоставляют возможность загружать файлы через формы. Специальный контрол позволяет выбрать локальный файл, который будет отправлен на сервер, обрабатывающий форму. Загружать файлы требуется достаточно часто, но технология управления формами загрузки редко обсуждается в статьях по CGI-программированию, и онлайн руководств/ссылок по этой теме также немного. Как мы убедимся, эта технология весьма проста.
Во-первых, нам необходимо подготовить HTML формы, которая будет содержать элемент загрузки:
<FORM ENCTYPE="multipart/form-data" ACTION="/cgi-bin/upload.pl" METHOD="POST">
Please choose directory to upload to:<br>
<SELECT NAME="dir">
<OPTION VALUE="images">images</OPTION>
<OPTION VALUE="sounds">sounds</OPTION>
</SELECT>
<p>
Please select a file to upload: <BR>
<INPUT TYPE="FILE" NAME="file">
<p>
<INPUT TYPE="submit">
</FORM>
В браузере это выглядит вот так:
Заметим, что параметр формы ENCTYPE="multipart/form-data" определяет метод кодирования, который будет использован при отправке формы.
На стороне сервера у нас будет CGI-скрипт (upload.pl), который будет работать с загрузкой. Мы используем модуль CGI.pm, который выполнит за нас всю грязную работу. CGI.pm обрабатывает отправку формы и предоставляет несложные методы получения всех частей отправки по-отдельности. В нашем примере имеется единственный элемент file.
1 #!/usr/bin/perl
2 use CGI;
3 my $cgi = new CGI;
4 my $dir = $cgi->param('dir');
5 my $file = $cgi->param('file');
Очевидно, чему равно значение $dir . Но какое значение приписано переменной $file ? На самом деле, переменная $file сейчас используется двояко:
Вот и все. Все, что нам остается сделать – это считать файл и сохранить содержимое куда-либо, или сделать с ним все, что захочется.
6 $file=~m/^.*(\\|\/)(.*)/; # strip the remote path and keep the filename
7 my $name = $2;
8 open(LOCAL, ">$dir/$name") or die $!;
9 while(<$file>) {
10 print LOCAL $_;
11 }
12 print $cgi->header();
13 print "$file has been successfully uploaded... thank you.\n";
Во-первых, из-за того, что имя файла, которое мы получили из формы, содержит полный путь к файлу на удаленном компьютере, нужно обрезать часть с путем. Именно это и делают строчки 6-7. Затем мы открываем локальный файл на сервере, пробегаемся по содержимому загруженного и распечатываем содержимое в локальный. В конце мы печатаем сообщение для браузера, чтобы подтвердить, что загрузка прошла успешно.
Онлайн документация/руководство
В разделе POD документации для CGI.pm описывается все, что вам нужно знать о загрузке файлов.
Переведено с сайта Perlfect Solutions
Комментарии
Отправить комментарий