PERL - статьи

       

Примеры скриптов


Q: Как одновременно поставить куки и сделать редирект?

A:

sub ReLocate

{

my($url,$cookie)=@_;

print "Status: 302 Moved\n";

if ($cookie ne '') { print "Set-Cookie: $cookie\n" }

print "Location: $url\n\n";

}

Примечание:

Не забудьте, что URL должен быть полным, частичные "не прокатывают" под некоторыми ОС и веб-серверами.

Q: Вечная тема - закачка файла на сервер(upload).

A:



#!/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.

Содержание раздела