2009-07-09 8 views
0

J'essaie de mettre en œuvre un indicateur de progression pour les téléchargements de fichiers. Les parties 1 et 2 du script s'exécutent correctement si elles sont exécutées séparément. Mais s'il est exécuté ensemble, le script s'arrête à:Pourquoi mon script Perl s'arrête-t-il si le module CGI est utilisé après la lecture de stdin sur Windows?

my $cg = new CGI(); 

Le problème se produit uniquement sur un serveur Windows. Quelle pourrait être la raison?

 
#!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; 
+0

Veuillez utiliser 'strict'. Évitez la notation d'objet indirect: my $ cgi = CGI-> new est préférable. Je ne suis pas sûr de ce que vous faites ici: tout ce code est-il dans le même fichier? Votre script a-t-il la permission d'écrire dans 'C: \ test'? –

Répondre

2

Essayez de faire binmode (STDIN) avant de lire. Je suppose que vous vous retrouvez avec moins d'octets que la longueur du contenu ne l'indique et que CGI est en train de gâcher. Vous devrez peut-être également faire le binmode après la réouverture de STDIN.

Veuillez également vérifier toutes vos opérations d'E/S pour connaître le succès.

1

Sous Windows, un fichier ne peut pas être ouvert pour la lecture alors qu'un autre processus l'ouvre pour écriture. Votre compteur de téléchargement ne fonctionnera pas parce que vous avez lu tout le STDIN et que vous l'avez ensuite écrit en TMP, vous passez ainsi de 0% à 100%.

Questions connexes