2012-07-17 2 views
0

Je suis en train de télécharger un fichier en Perl, le fichier est créé lorsque je le vérifie sur le serveur ftp, mais la taille est 0 là, je me demande pourquoi cela se passe, j'ai cherché et essayé beaucoup mais n'a pas pu résoudre cela, pourriez-vous s'il vous plaît m'aider?Erreur dans le téléchargement de fichier dans perl

Voici le code que je suis en utilisant:

 
    enter code here 
    use CGI; 
    my $query = new CGI; 
    my $upload_dir = "/home/public_html/upload/avatars"; 
    my $filename = $ses->getUserId."_".$query->param("profile_avatar"); 
    my $org_filename = $ses->getUserId."_".$f->{profile_avatar}; 
    my ($name, $path, $extension) = fileparse ($org_filename , qr/\.[^\.]+$/); 
    $filename = $name . $extension; 
    my $safe_filename_characters = "a-zA-Z0-9_.-"; 
    $filename =~ tr/ /_/; 
    $filename =~ s/[^$safe_filename_characters]//g; 
    $filename =~ s/.*[\/\\](.*)/$1/; 
    my $upload_filehandle = $query->upload("profile_avatar"); 
    open(UPLOADFILE, ">$upload_dir/$filename") or $ses->message("$!"); 
    binmode UPLOADFILE; 
    while (<$upload_filehandle>) 
    { 
     print UPLOADFILE; 
    } 
    close UPLOADFILE; 

Dans cette variable (upload_filehandle de $) Je reçois rien sens vide, je ne sais pas pourquoi est-ce qui se passe. Toute aide serait appréciée.

Répondre

0

est ici un sous-programme que je connais fonctionne ...

J'ai un CGI comme le vôtre qu'il appelle avec le paramètre, $ query-> param (« profile_avatar »);

sub upload_bin_file 
{ 
my ($ufile) = @_; 
my $ufilename = "\L$ufile"; #Force filename to be lower case 
$ufilename = ~s/\\/\//g;  # Convert backslashes to forward slashes 

my @dirs = split(/\//, $ufilename); # SPlit the filename by the paths(s) 
my $dfile = "$UFILE_DIR/$dirs[$#dirs]"; # This takes just the filename part 
print "File uploaded to [$dfile]<BR>\n"; # Optional debug statement 

open(DEST,">$dfile") or die "[F] Upload server: Could not open $dfile: $!"; 
binmode(DEST); 
binmode($ufile); 
my @src_content=<$ufile>; 
print DEST @src_content; 
close($ufile); 
close(DEST); 

$dfile; #Return the name of the file that we uploaded 
} 

Je ne suis pas sûr si le binmode du fichier entrant est la réponse, ou dépouillant le chemin du nom de fichier. Vous pouvez l'essayer et voir :)

0

J'ai eu le même problème, et j'ai perdu beaucoup de temps à essayer de le comprendre. Dans mon cas, la solution était simple, mais pas du tout évidente. Je prends note de cela au cas où les gens le trouveraient utile.

Il se trouve CGI.pm (3.5.2) crée des fichiers temporaires dans/usr/tmp/

Pour des raisons que je ne suis pas vraiment sûr, ma machine avait> 480 de ces assis autour; certains d'entre eux assez grands. En principe, ceux-ci sont censés être supprimés à la sortie, mais étaient apparemment toujours là. Quand je les ai supprimés, les choses ont juste recommencé à fonctionner avec le (s) script (s) original (s), comme avant.

Malheureusement je nettoyais tmp/sur une alouette, sans vraiment autour, en utilisant 'rm/usr/tmp/CGI *. Il est possible que tmp/ait été complètement rempli et que je sois juste parvenu à libérer de l'espace. Mais perl (v5.14.2) obtenait ce qu'il pensait être une poignée de fichier parfaitement ok. Et personne n'a remarqué ou s'est plaint (c'est un serveur, donc on pourrait penser qu'ils auraient dû).

code utile pour le long du chemin:

print "Content-type: text/html\012\012"; 
print "<html><head></head><body>\012"; 
print "<b>Below is an EXACT echo of what your browser sent:</b>\012<hr>"; 
print "<pre>\012"; 
while (<STDIN>) { 
    s/>/&gt;/g; 
    s/</&lt;/g; 
    print $_; 
} 

print "</pre>\012"; 
print "</body></html>\012"; 
Questions connexes