Почему мой Perl-скрипт останавливается, если модуль CGI используется после чтения из стандартного ввода в Windows? - PullRequest
0 голосов
/ 09 июля 2009

Я пытаюсь реализовать индикатор прогресса для загрузки файлов. Part1 и Part2 скрипта работают правильно, если выполняются отдельно. Но при совместном выполнении сценарий останавливается на:

my $cg = new CGI();

Проблема возникает только на сервере Windows. Что может быть причиной?

#!C:\Perl\bin\perl.exe -w
use CGI;
$post_data_filename = "C:\\test\\postdata.txt";
$uploaded_filename = "C:\\test\\uploaded_file.txt"; 

#PART 1
# read and store the raw post data in a temporary file so that we can repeatedly
# look at size of this temporary file in order to implement a progress bar
open(TMP,">","$post_data_filename");
$len = $ENV{'CONTENT_LENGTH'};
read (STDIN ,$LINE, $len);
print TMP $LINE;
close (TMP);

#PART 2
#use a CGI instance to read the raw post data and extract the uploaded file from it
my $cg = new CGI();
open(STDIN,"$post_data_filename");
my $fh = $cg->upload('file[0]');
open($tmp_fh, ">$uploaded_filename");
while(<$fh>) {
    print $tmp_fh $_;
    }
close($tmp_fh);

print "Content-type: text/html\n\n";
print "Ready\n";

exit;

Ответы [ 2 ]

2 голосов
/ 09 июля 2009

Попробуйте сделать binmode (STDIN) перед чтением с него. Я предполагаю, что у вас меньше байтов, чем говорит длина контента, и это приводит к тому, что CGI портится. Вам также может понадобиться сделать binmode после повторного открытия STDIN.

Кроме того, пожалуйста, проверьте все свои операции ввода-вывода для успеха.

1 голос
/ 20 мая 2010

В окнах файл не может быть открыт для чтения, в то время как другой процесс открывает его для записи.

И ваш индикатор загрузки не будет работать, потому что вы прочитали весь STDIN, а затем записали его в TMP, так что вы переходите от 0% к 100%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...