Главная страница статей --> Советы по фотошопу, графике и хитрости в построении php кода

Upload File (Загрузка файла на сервер средствами Perl)

Источник: realcoding.net

Код программы:

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



Похожие статьи:
- Советы дилетанта или как сделать полноценный корпоративный сайт.
- Язык XML
- PHP в примерах
- Табличная вёрстка
- Исследование поисковых систем
- MySQL против PostgreSQL
- Hackers Manifesto
- Резервное копирование баз MySQL
- Регистрация доменных имен своими руками. Корпоративный домен в зоне "ru".
- Подсказки по работе в системе Google Adsense.
- PHP и DNS. Проверка почтового адреса
- Создание сайтов с возможностью печати PDF на примере PDF::AP
- Как бороться с magic_quotes_gpc


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]