Загрузка файла на PERL

Автор: Topol Суббота, Август 11th, 2012 Нет комментариев

Рубрика: Perl

#!/usr/bin/perl                              # используйте -T для CGI-скриптов $SIG{ALRM} = sub { die "$0 timed out" };     # эти 2 строки не работают под alarm 900;                                   # Windows, но они необязательны use strict;                                  # спасает от глупых ошибок use Fcntl;                                   # O_EXCL, O_CREAT и O_WRONLY use CGI       qw (:standard);                # читайте "perldoc CGI" use CGI::Carp qw (fatalsToBrowser);          # вывод ошибок к browser-у $CGI::POST_MAX = 131072;                     # максимальный ввод = 128 KB my $foto = param ('foto');                   # имя файла и одноврем. handle my $DIR  = '/home/alex/pics'                # не забудьте "chmod 777 pics" my $JS   = "                                   // JavaScript-функция для пред-                                               // варительной проверки формы function check (form) {    if (form.elements['foto'].value.length < 4)// foto должно быть заполнено    {        alert ('A gde zhe foto?');             // показать JavaScript-окошко        form.elements['foto'].select ();       // выделить текст в поле foto        form.elements['foto'].focus ();        // и прыгнуть туда курсором        return false;                          // false запретит browser-у    }                                          // отправлять данные к серверу    return true;                               // все OK - можно отправлять }"; print header (-type  => 'text/html; charset=koi8-r'),      start_html (-title  => 'МИСС ИHТЕРHЕТ',    # напечатать заголовок и $JS                  -script => $JS);           # regex внизу проверяет, есть ли .gif или .jp(e)g в конце и кладет имя # файла в $1 if ($foto !~ /([w-]+ . (?: gif | jpe?g ))$/ix) #только имя,путь выкидывается {    print h1 ('Отправьте нам фото!'),            #start_form работать не будет          start_multipart_form (-onsubmit => 'return check (this)'),          filefield (-name => 'foto'),          submit (-value => 'Go baby go!'),      # напечатать форму с кнопкой          end_form;                              # напечатать } # Этот скрипт никому не мешает вводить мусор (например xxxx.gif) в поле foto, # что приведет к созданию пустых файлов; если это Вас беспокоит, установите # новую версию CGI.pm и прочтите # http://stein.cshl.org/WWW/software/CGI/#upload elsif (not sysopen FILE, "$DIR/$1", O_EXCL | O_CREAT | O_WRONLY, 0444) {    print h1 ("Hе могу создать $DIR/$1: $!"); # ошибка или такой файл уже есть } # Портятся файлы при посылке? См. ниже! else                                           # все в порядке - файл создан {    binmode FILE;                              # включить binmode для Windows    print FILE while (<$foto>);                # и скопировать данные в файл    close FILE;    print h1 ('Сердечное Вам спасибо!');       # воспитывать как собак Павлова } print end_html;                                # напечатать ========================== Если закачка некоторых файлов происходит с глюками - видимо, файл перекодируется на лету русским апачем. Варианты решения: 1.запретите  все  перекодировки  для  скрипта,  который  разбирает FileUpload, например таким способом:    CharsetDisable On    и делайте перекодировку сами. 2.Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но  при  этом  вам  все равно  придется перекодировать вручную текстовые части запросов.  Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.

Источник:  internet-technologies.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты