Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Sly Golovanov                        2:5020/794.13  26 Mar 2001  05:00:39
 To : All
 Subject : FAQ 3/3
 -------------------------------------------------------------------------------- 
 
 Примеры скриптов и функций
 ------------------------------------------------------------------------------
 Q: Как одновременно поставить куку и сделать редирект?
 A:
 sub ReLocate
 {
   my($where,$cookie)=@_;
   print "Status: 302 Moved\n";
   if ($cookie ne '') { print "Set-Cookie: $cookie\n" }
   print "Location: $where\n\n";
 }
 
 ------------------------------------------------------------------------------
 
 Q: Hадо записать в файл строку, а потом прочесть ее оттуда
 A:
 # записать строку в файл
 open FILE,'>file';   # открыть файл на запись
 print FILE 'строка'; # записать строку
 close FILE;          # закрыть файл
 
 # прочитать строку из файла
 open FILE,'file'; # открыть файл на чтение
 $string=<FILE>;   # прочесть одну строку, включая символ "перевод строки"
 chomp($string);   # обрезать в конце строки "перевод строки", если он есть
 close FILE;       # закрыть файл
 
 ------------------------------------------------------------------------------
 
 Q: Закачка файлов на сервер и решение глюка с закачкой
 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;                              # напечатать </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;                                # напечатать </BODY></HTML>
 
 ==========================
 Если закачка некоторых файлов происходит с глюками - видимо, файл
 перекодируется на лету русским апачем.
 
 Варианты решения: 
 1.запретите  все  перекодировки  для  скрипта,  который  разбирает FileUpload,
 например таким способом:
 
   <Location /path/to/upload.cgi>
   CharsetDisable On
   </Location>
 
   и делайте перекодировку сами.
 
 2.Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23,
 но  при  этом  вам  все равно  придется перекодировать вручную текстовые части
 запросов.  Для этого можно использовать Russian Apache API, доступное в других
 модулях или Russian Apache Perl API, доступное из mod_perl.
 
 ---
  * Origin:  (2:5020/794.13)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 FAQ 3/3   Sly Golovanov   26 Mar 2001 05:00:39 
Архивное /ru.perl/2599396e8035c.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional