2010-07-07 3 views
0

J'ai essayé d'utiliser ce script très simple pour télécharger un fichier sur mon serveur. Pour une raison quelconque, cela ne fonctionne pas. Je reçois le message suivant dans mon erreur apache journal:Le téléchargement du fichier perl ne peut pas init filehandle


Use of uninitialized value in <HANDLE> at /opt/www/demo1/upload/image_upload_2.pl line 15. 
readline() on unopened filehandle at /opt/www/demo1/upload/image_upload_2.pl line 15. 

#!/usr/bin/perl -w 

use CGI; 

$upload_dir = "/opt/www/demo1/upload/data"; 
$query = new CGI; 
$filename = $query->param("photo"); 
$filename =~ s/.*[\/\\](.*)/$1/; 
$upload_filehandle = $query->upload("photo"); 

open UPLOADFILE, ">$upload_dir/$filename"; 
binmode UPLOADFILE; 

while (<$upload_filehandle>) 
{ 
    print UPLOADFILE; 
} 

close UPLOADFILE; 

1 

Toutes les idées ce qui est mal là-bas? Merci mx

+0

Le fichier existe-t-il réellement? Votre script dispose-t-il des autorisations appropriées pour y accéder? – mcandre

+0

Quelles permissions sont nécessaires? Il a 777 - et si j'imprime quelque chose, cela fonctionne. Le fichier que je veux écrire est également 777 mais il se bloque bevore, il n'obtient pas le handle de l'objet CGI. Dans le formulaire qui appelle le script j'ai le champ de saisie suivant: Ceci est correct, n'est pas il? – marcusx

+0

Quel est le 'enctype' pour la balise' form'? –

Répondre

5

Les formulaires de téléchargement de fichiers doivent spécifier enctype="multipart/form-data". Voir W3C documentation.

En outre, notez ce qui suit:

#!/usr/bin/perl 

use strict; use warnings; 
use CGI; 

my $upload_dir = "/opt/www/demo1/upload/data"; 
my $query = CGI->new; # avoid indirect object notation 

my $filename = $query->param("photo"); 
$filename =~ s/.*[\/\\](.*)/$1/; # this validation looks suspect 

my $target = "$upload_dir/$filename"; 

# since you are reading binary data, use read to 
# read chunks of a specific size 

my $upload_filehandle = $query->upload("photo"); 
if (defined $upload_filehandle) { 
    my $io_handle = $upload_filehandle->handle; 
    # use lexical filehandles, 3-arg form of open 
    # check for errors after open 
    open my $uploadfile, '>', $target 
     or die "Cannot open '$target': $!"; 
    binmode $uploadfile; 

    my $buffer;   
    while (my $bytesread = $io_handle->read($buffer,1024)) { 
     print $uploadfile $buffer 
      or die "Error writing to '$target': $!"; 
    } 
    close $uploadfile 
     or die "Error closing '$target': $!"; 
} 

Voir CGI documentation.

+0

Les formulaires de téléchargement de fichiers doivent spécifier enctype = "multipart/form-data". C'était le tour! Merci!! (Aussi pour les autres indices) – marcusx

0

Si vous téléchargez un fichier texte alors ci-dessous doit être défini dans <head> de fichier html:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Sinon, le $file_name = $query->param("file_name") est défini dans un contexte scalaire (print $file_name) et undef dans un contexte de fichier (<$file_name>) .

Questions connexes