Forum Webscript.Ru

Программирование => Perl => Тема начата: sickboy от 19 Октября 2006, 14:09:23

Название: upload файлов
Отправлено: sickboy от 19 Октября 2006, 14:09:23
Помогите разобраться с upload\'ом файлов.

код
use CGI;
use CGI::Simple;

$q = new CGI;
$u = new CGI::Simple;

$file_name = $q->param (\'uploaded_file\');
$fh = $u->upload($file_name);

open FH, ">$path/$file_name" or die "";
binmode FH;
print FH $buffer while read( $fh, $buffer, 4096 );
print $buffer;
close FH;

print $upload->cgi_error();
в итоге получаю файл размеров в 0 байт. и ошибку No filehandle for \'my_file\'.
Насколько я понял, не работает:
$fh = $u->upload($file_name);
а вот почему, не знаю.
Название: upload файлов
Отправлено: arto от 19 Октября 2006, 14:15:49
perldoc CGI
perldoc CGI::Simple

это разные модули, постарайтесь выбрать один из них.
Название: upload файлов
Отправлено: sickboy от 19 Октября 2006, 15:03:13
выбрал CGI::Simple, теперь даже не получает имя файла, делаю все по описанию http://search.cpan.org/~jfreeman/Cgi-Simple-0.077/Simple.pm#upload()_The_key_file_upload_method
Название: upload файлов
Отправлено: arto от 19 Октября 2006, 15:39:21
А вы читали полностью и подробно документацию?
И про DISABLE_UPLOADS тоже?
Название: upload файлов
Отправлено: sickboy от 19 Октября 2006, 15:47:56
Да,
$CGI::Simple::POST_MAX = 1_048_576;
$CGI::Simple::DISABLE_UPLOADS = 0;
Название: upload файлов
Отправлено: arto от 19 Октября 2006, 15:53:23
у меня работает.
покажите ваш код.
Название: upload файлов
Отправлено: sickboy от 19 Октября 2006, 16:20:23
форма:




upload with CGI::Simple



   

       
       
   





скрипт
#!/usr/bin/perl

use CGI::Simple;

$query = new CGI::Simple;
$CGI::Simple::POST_MAX = 1_048_576;
$CGI::Simple::DISABLE_UPLOADS = 0;
$path = \'/home/public_html/upload\';
$filename = $query->param (\'uploaded_file\');
$fh = $query->upload($filename);
open FH, ">$path/$filename" or die "Oops $!\\n";
binmode FH;
print FH $buffer while read( $fh, $buffer, 4096 );
print $buffer;
close FH;
Название: upload файлов
Отправлено: arto от 19 Октября 2006, 16:30:09
перенести POST_MAX и DISABLE_UPLOADS перед new CGI::Simple
Название: upload файлов
Отправлено: arto от 19 Октября 2006, 16:31:13
вы невнимательно читали документацию:

You can enable uploads using the \'-upload\' pragma. You do this by specifying this in you
       use statement:

           use CGI::Simple qw(-upload);

       Alternatively you can enable uploads via the $DISABLE_UPLOADS global like this:

           use CGI::Simple;
           $CGI::Simple::DISABLE_UPLOADS = 0;
           $q = new CGI::Simple;

       If you wish to set $DISABLE_UPLOADS you must do this *after* the use statement and
       *before* the new constructor call as shown above.
Название: upload файлов
Отправлено: sickboy от 19 Октября 2006, 18:32:46
Да, действительно не внимательно.
Скрипт заработал на unix хостинге, а вот на Windows пока не хочет, создает только пустой файл, причем пишет:
No filehandle for \'music.asx\'. Are uploads enabled ($DISABLE_UPLOADS = 0)? Is $POST_MAX big enough?
буду признателен за помощь.
Название: upload файлов
Отправлено: arto от 19 Октября 2006, 18:42:08
с виндовс не работаю
Название: upload файлов
Отправлено: NeoNox от 19 Октября 2006, 20:50:15
С путями открываемого файла не напутал?
Название: upload файлов
Отправлено: sickboy от 19 Октября 2006, 23:44:53
Нет, не думаю.
Более того:
например в Opera:
после загрузки на сранице получаю:
filename: d:\\full_path\\doc_root\\upload\\URL.3gp
No filehandle for \'URL.3gp\'. Are uploads enabled ($DISABLE_UPLOADS = 0)? Is $POST_MAX big enough?
при этом файл создается нулевого размера.
Через IE:
filename: d:\\full_path\\duc_root\\upload\\C:\\WINDOWS\\cmsetacl.log
ошибок нет, при этом в качестве имени файла используется полный путь с именем файла с локальной машины.
Файл не создается, даже нулевого размера.