Forum Webscript.Ru

Программирование => Perl => Тема начата: Yuraz от 19 Июля 2002, 09:14:13

Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 19 Июля 2002, 09:14:13
Всех приветствую!
Встретился с такой проблемой, в первый раз решил использовать закачку файлов на сайте, сделал все по книге CGI-программирование, Павлова.
Форма на экран выводится, после заполнения полей и указания файла, нажимаю кнопку отправить. Браузер начинает отсчитывать секунды и минуты, и ни чего. Подскажите, в чём проблема?
Пользуюсь W2K, Apache 3.12, Perl, на локалхосте.


#!/usr/local/bin/perl
#fileput.pl
#############
#############
$datafile="fotos.txt"; #
$fotodir="."; #
$cgi = "http://127.0.0.8/cgi-bin/fileput.pl";
#############
#
#############
print "Content-type: text/html\\n\\n"; #
if($ENV{\'REQUEST_METHOD\'} eq \'GET\'){$query=$ENV{\'QUERY_STRING\'};}
else{sysread(STDIN,$query,$ENV{\'CONTENT_LENGTH\'});}
if($query eq \'\'){
print <











Èìÿ
Ìûëî
Êîìåíòàðèé
Ôîòî




FORM
}
else{
if($ENV{\'CONTENT_TYPE\'}=~/multipart/){
  ($bound)=($ENV{\'CONTENT_TYPE\'}=~/boundary=(\\S+)/);
  @parts=split(/\\n--$bound(-)*/,$query);
  @parts=grep($_ ne \'\' ,@parts);
  foreach(@parts){
    ($header,$body)=split(/\\n\\s*\\n/,$_,2);
    ($name)=(/name=\\"([^\\"]*)\\"/);
    $body=~s/\\n$//;
    $body=~s/\\r$//;
    ($filename)=(/filename\\"([^\\"]*)\\"/);
    if($name eq \'username\'){$username=$body;}
    if($name eq \'useremail\'){$useremail=$body;}
    if($name eq \'usercomment\'){$usercomment=$body;}
    if($name eq \'userfoto\'){$userfoto=$body;$userfilename=$filename;}
    }
  }
else{}
$userfilename1=$userfilename;
$filedup=0;
while(-e "$fotodir/$userfilename1"){
  $userfilename1="$filedup_$userfilename";
  $filedup++;
  }
open(F,">$fotodir/$userfilename1");
print F $userfoto;
close(F);
open(DATA,">>$datafile");
print DATA "$username::$useremail::$userfilename1::$usercomment\\n";
close(DATA);
print "";
print "!!!!!!!!!!!!!!!!!!!!!!";
print "";
}
Название: Закачка. Скрипт прилагается.
Отправлено: Chs от 19 Июля 2002, 09:27:10
Фак смотрим, да?
Там есть работающий пример.

P.S.: И каждый раз находиться кто-то, кто пытается сделать разбор параметров ручками. Ээээ...надоели....
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 19 Июля 2002, 09:31:34
Да, забыл указать, после Submit, Apache подвисает, комп работает под 100%, пока Apache принудительно не закроешь, так и будет под 100% висеть. В логах Apache ничего не пишет.

PS: Может у кого есть другой примитив скрипта этой же реализации?
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 19 Июля 2002, 09:32:46
Цитировать
Фак смотрим, да?
Там есть работающий пример.

Сорри, сейчас смотрю.
Название: Закачка. Скрипт прилагается.
Отправлено: Evgeny от 19 Июля 2002, 10:33:37
Цитировать
Да, забыл указать, после Submit, Apache подвисает, комп работает под 100%, пока Apache принудительно не закроешь, так и будет под 100% висеть. В логах Apache ничего не пишет.

PS: Может у кого есть другой примитив скрипта этой же реализации?

Это ещё что значит? После выполнения скрипта Апач перезапускать надо? В чем проблема может быть?
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 19 Июля 2002, 11:04:39
use strict;
use Fcntl;

Хорош пример, ничего не скажешь.
Название: Закачка. Скрипт прилагается.
Отправлено: Evgeny от 19 Июля 2002, 12:43:46
А вообще, без модулей, как закачка реализуется? Откуда данные файла считываются? Из STDIN читаются?
Ни у кого нет работающего примера?
Название: Закачка. Скрипт прилагается.
Отправлено: NeoNox от 19 Июля 2002, 13:10:54
Цитировать
Откуда данные файла считываются? Из STDIN читаются?
А модуль посмотреть? :)
Название: Закачка. Скрипт прилагается.
Отправлено: NeoNox от 19 Июля 2002, 13:12:19
Цитировать
Хорош пример, ничего не скажешь.

Сарказм? Напрасно.
Название: Закачка. Скрипт прилагается.
Отправлено: Evgeny от 19 Июля 2002, 14:55:42
Цитировать
А модуль посмотреть?

А подсказать? ;)
Название: Закачка. Скрипт прилагается.
Отправлено: NeoNox от 19 Июля 2002, 15:15:56
Цитировать
А подсказать?

Предлагаешь мне его поковырять? :)
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 19 Июля 2002, 15:56:04
Цитировать
Сарказм? Напрасно.

Не хочется инсталировать различные модули. Хотя да, с этими модулями код уж очень простой в факе.
Вопрос, почему ж мой то не пашет, из книги Павлова? Набрал вроде один к одному, 500 ошибок не выдаёт. Может дело в
 

этой строке, не правильно указал ссылку на скрипт, пробовал всяко, тогда как правильно....
Название: Закачка. Скрипт прилагается.
Отправлено: NeoNox от 19 Июля 2002, 16:01:16
Цитировать
Не хочется инсталировать различные модули.

Сложно их вырезать из стандартной поставки Perl...
Цитировать
Вопрос, почему ж мой то не пашет, из книги Павлова?

Это вопрос, вероятно, к Павлову. :)
Название: Закачка. Скрипт прилагается.
Отправлено: от 22 Июля 2002, 20:41:46
Цитировать
Вопрос, почему ж мой то не пашет, из книги Павлова?
//quote]
Ну давайте начнем обсуждать правильно ли в книге Павлова сделан разбор multpart/form-data.:)
Если очень интересно посмотри как сделано тоже самое в CGI.
Название: Закачка. Скрипт прилагается.
Отправлено: Serchey от 22 Июля 2002, 21:49:39
Короче говоря, проанализировав твой(Павлова) код и симптомы Апач, я пришел к выводу, что баг в этих местах:
...
foreach(@parts){
($header,$body)=split(/\\n\\s*\\n/,$_,2);
($name)=(/name=\\"([^\\"]*)\\"/);  - - - - - лажа
$body=~s/\\n$//;
$body=~s/\\r$//;
($filename)=(/filename\\"([^\\"]*)\\"/); - - - - - лажа
...

попробуй ($name) = ($header =~ /name=\\"?([^"\\]*\\"/);
($filename) = ($header =~ /filename=\\"?([^"\\]*\\"/) соответственно.

Может я и ошибаюсь, но в любом случае используй хотя бы -w.
А вот в конструкции
...
while(-e "$fotodir/$userfilename1"){
$userfilename1="$filedup_$userfilename"; - - - полная лажа
$filedup++;
}
...
правильно будет $userfilename1="$filedup\\_$userfilename";
тут ошибка на 100%, потому как "$filedup_$userfilename" интерпретируеться как "$filedup_"+"$userfilename". Первое у нас - андеф, соответственно мы получаем замкнутый цыкл - потому Апач и виснет.
На первый взгляд болше топорных ошыбок я не встретил.
Удачи!
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 23 Июля 2002, 18:07:55
Serchey спасибочи за разбор, сейчас ещё возьмусь за этот скрипт, о результатах расскажу.
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 23 Июля 2002, 18:37:45
Цитировать
($name)=(/name=\\"([^\\"]*)\\"/); - - - - - лажа
$body=~s/\\n$//;
$body=~s/\\r$//;
($filename)=(/filename\\"([^\\"]*)\\"/); - - - - - лажа
...

попробуй ($name) = ($header =~ /name=\\"?([^"\\]*\\"/);
($filename) = ($header =~ /filename=\\"?([^"\\]*\\"/) соответственно.


С этим вообще не работает, а вот

Цитировать
правильно будет $userfilename1="$filedup\\_$userfilename";


действительно помогло, но не совсем, теперь файлы как бы уходят, прописывается в txt файл что пришло, а вот сам файл (картинка, архив) превр. в бинарный файл размером от 3 до 60 байт
Название: Закачка. Скрипт прилагается.
Отправлено: Serchey от 23 Июля 2002, 19:42:42
Извени, вышла ошибочка:
Цитировать
($name) = ($header =~ /name=\\"?([^"\\]*\\"/);
($filename) = ($header =~ /filename=\\"?([^"\\]*\\"/) соответственно

не поставил ")":
($name) = ($header =~ /name=\\"([^"\\]*)\\"/);
($filename) = ($header =~ /filename=\\"([^"\\]*)\\"/) соответственно.
Ты 100% процентов работаешь под Виндой(ну ладно, 99%), а потому перед записью в файл укажи binmode:
Цитировать

open(F,">$fotodir/$userfilename1") || die "Can\'t write: $!\\n";
binmode(F);
print F $userfoto;
close F;
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 24 Июля 2002, 07:48:15
В общем такой скрипт получился, ошибок нет, но и файлы не сохраняет.. даже однобайтовых сейчас не делает..
#!/usr/local/bin/perl -w
#fileput.pl
#############
#############
$datafile="fotos.txt"; #
$fotodir="C:/"; #
$cgi = "http://127.0.0.8/cgi-bin/fileput.pl"; #ÊÀÊ_ÂÛ_ÎÁÎÇÂÀËÈ_ÑÊÐÈÏÒ
#############
#
#############
print "Content-type: text/html\\n\\n"; #
if($ENV{\'REQUEST_METHOD\'} eq \'GET\'){$query=$ENV{\'QUERY_STRING\'};}
else{sysread(STDIN,$query,$ENV{\'CONTENT_LENGTH\'});}
if($query eq \'\'){
print <











Èìÿ
Ìûëî
Êîìåíòàðèé
Ôîòî




FORM
}
else{
if($ENV{\'CONTENT_TYPE\'}=~/multipart/){
  ($bound)=($ENV{\'CONTENT_TYPE\'}=~/boundary=(\\S+)/);
  @parts=split(/\\n--$bound(-)*/,$query);
  @parts=grep($_ ne \'\' ,@parts);
  foreach(@parts){
    ($header,$body)=split(/\\n\\s*\\n/,$_,2);
    ($name) = ($header =~ /name=\\"([^\\"]*)\\"/);
    $body=~s/\\n$//;
    $body=~s/\\r$//;
    ($filename) = ($header =~ /filename=\\"([^\\"]*)\\"/);
    if($name eq \'username\'){$username=$body;}
    if($name eq \'useremail\'){$useremail=$body;}
    if($name eq \'usercomment\'){$usercomment=$body;}
    if($name eq \'userfoto\'){$userfoto=$body;$userfilename=$filename;}
    }
  }
else{}
$userfilename1=$userfilename;
$filedup=0;
while(-e "$fotodir/$userfilename1"){
  $userfilename1="$filedup\\_$userfilename";
  $filedup++;
  }
open(F,">$fotodir/$userfilename1");
binmode(F);
print F $userfoto;
close(F);
open(DATA,">>$datafile");
print DATA "$username::$useremail::$userfilename1::$usercomment\\n";
close(DATA);
print "";
print "Файлик закачан";
print "";
}
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 02 Августа 2002, 12:45:53
Скрипт закачки из FAQ точно ли рабочий?
http://progres.h1.ru/cgi-bin/up2.pl
не работает

Люди! Помогите! Я устал от этих закачек, 2 недили не могу настроить.... Есть сервер, пустой, на фри хостинге(http://ini.h1.ru). Скину пароли кто сможет хотя бы этот примитивный скрипт настроить там. Оплачу работу в этот же день, почтовым переводом. Мне очень очень надо чтобы была простая закачка - и тут же (ниже формы) обзор всей директории с галочками(кнопками) для удаления файла. Всё. По цене обговорим, напишите rec@ezmail.ru, по возможности отвечу сразу, на тех же условиях приму готовый скрипт
Название: Закачка. Скрипт прилагается.
Отправлено: The Undertaker от 05 Августа 2002, 10:39:31
А как насчёт обменника? если надо он там (http://66.hoha.ru/obmennik/)

логин: script
пасс: LLk9F8rS
Название: Закачка. Скрипт прилагается.
Отправлено: Energizer от 05 Августа 2002, 11:12:38
Yuraz вот попробуй запустить эту функцию закачки, единственное эта функция которая обрабатывает, не полный скрипт...

что будешь зачачивать -> $praiz.  
 
sub praiz_close
{
   my $praiz = param(\'praiz\');
                my($format1);
                my $path_praiz="../www/name/file/"; #### куда закачивать будем
   
   # проверяем
                 if ($praiz eq "")
   {
      error(\'Файл не был выгружен !\');
   }
   else
   {
            my $name=$praiz;
            my($filename,$i,$TOname,$savename,$bytesread,$buffer);

            $filename=$name;
      
            $i = rindex( $filename,"\\\\") + 1 ;  
            $TOname = substr( $filename, $i, 255 );
            
            $savename  = "$path_praiz/".$TOname;
            #### проверка какой файл был закачен, допускаем только файл с расширением zip, xls, doc
            if ( ($filename !~ /zip/i) && ($filename !~ /xls/i) && ($filename !~ /doc/i) )
            {
               error(\'Файл должен быть загружен в формате - Zip, Excel или Word\');
            }
            #### delite old
            opendir(DIR,"$path_praiz") or die;
            my @files=readdir DIR;
            closedir(DIR);
            foreach my $files(@files)
            {
               unlink("$path_praiz/$files");
            }
            ### close
            open (IMG, "> $savename") || die "Can\'t open $savename: $!";
             flock IMG, $LOCK_EX;
             while ($bytesread=read($filename,$buffer,1024)) { print IMG $buffer; }
             flock IMG, $LOCK_UN;
             close(IMG);
            
            $praiz=$TOname;
            
            $format1=$praiz;
            my @temp=split /\\./,$format1;
            $format1=$temp[1];
         }
         
   
}
Название: Закачка. Скрипт прилагается.
Отправлено: Yuraz от 06 Августа 2002, 09:29:30
Energizer, спасибо, уже справился с этой задачей, благодаря Глебу с этого форума, так же ещё нащёл много файловых скриптов, как раз с закачкой и ещё многих функции, ссылка ниже
http://www.scriptsearch.com/Perl/Scripts_and_Programs/File_Management