Я хотел бы сохранить дескриптор файла в глобальный хеш и прочитать() его в подпрограмме без выявления объекта CGI, но я обнаружил, что он не работает (в результате получается выходной файл нулевого размера).CGI.pm: дескриптор файла в глобальном хеше потерян между подпрограммами?
Вот упрощенный код Perl:
#!/usr/local/bin/perl
use CGI;
use vars qw(%in);
&init_hash;
$fname = &process_uploaded_file if($in{'upfile'});
$fsize = -s $fname;
print "Content-Type: text/plain\r\n\r\n";
print "in{'upfile'}=",$in{'upfile'},"\r\n";
print "in{'desc'}=",$in{'desc'},"\r\n";
print "fname=",$fname,"\r\n";
print "fsize=",$fsize,"\r\n";
sub init_hash{
my $q = new CGI;
$in{'desc'} = $q->param('desc');
$in{'upfile'} = $q->param('upfile');
$in{'upfh'} = $q->upload('upfile') if($in{'upfile'});
}
sub process_uploaded_file{
my $fname = time.'.bin';
open(OUT,'>',$fname) || die('open file failed');
while(my $read = read($in{'upfh'}, my $buff, 4096)){
print OUT $buff;
}
close(OUT);
eval { close($in{'upfh'}); };
return $fname;
}
EDIT: я должен предоставить Perl и CGI.pm версии. Версия для Perl: это perl 5, версия 12, subversion 2 (v5.12.2), построенная для MSWin32-x86-многопотоковых (с 8 зарегистрированными исправлениями, см. Perl -V для более подробной информации) $ CGI :: VERSION = «3,50»;
Я думаю, вам нужно проверить, читается ли информация из файла $ в {'upfh'} –
@KostiaShiian, но файл создан и доступен для записи. Если я добавлю содержимое process_uploaded_file к init_hash и закомментирую строку 7, он будет работать. – Roy