Управление загрузкой файлов из www форм с CGI.pm

Технология для управления формами загрузки файлов редко обсуждается в статьях по CGI, и руководств по этой теме также немного. Как мы убедимся, эта технология весьма проста. Рассмотрим пример на perl.

Введение.

Многие браузеры предоставляют возможность загружать файлы через формы. Специальный контрол позволяет выбрать локальный файл, который будет отправлен на сервер, обрабатывающий форму. Загружать файлы требуется достаточно часто, но технология управления формами загрузки редко обсуждается в статьях по 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>

В браузере это выглядит вот так:

Please choose directory to upload to:

Please select a file to upload:

Заметим, что параметр формы ENCTYPE="multipart/form-data" определяет метод кодирования, который будет использован при отправке формы.

CGI скрипт.

На стороне сервера у нас будет CGI-скрипт на языке perl (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 сейчас используется двояко:

  1. В скалярном контексте это имя файла на компьютере клиента, как оно показывается в окне выбора файла
  2. Когда она используется в контексте filehandle – указателя на файл - переменная ведет себя как указатель на файл, открытый для чтения, откуда можно считать загруженный файл как и обычный файл, загружаемый локально. (В действительности, CGI.pm сохраняет загруженное во временный файл и предоставляет нам открытый указатель на файл, так что мы можем читать из него.)

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

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. Затем мы открываем локальный файл на сервере, пробегаемся по содержимому загруженного и распечатываем содержимое в локальный. В конце мы печатаем сообщение для браузера, чтобы подтвердить, что загрузка файла прошла успешно.

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <i> <strong> <b> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <br>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
CAPTCHA на основе изображений
Введите код с картинки