2010-12-01 8 views
1

Le code pour mon sous:résultats différents pour la ligne de commande et CGI pour le script de formulaire web perl

sub put_file 
{ 
    my($host, $placement_directory, $tar_directory, $filename, $user, $pass) = @_; 
    my $ftp = Net::FTP->new($host) or die "cannot connect to localhost"; 

    $ftp->login($user, $pass) or die "cannot log in"; 

    $ftp->cwd($placement_directory); 
    print $tar_directory."/".$filename; 
    $ftp->put("$tar_directory/$filename") or die "cannot put file ", $ftp->message; 

    print "File has been placed \n"; 
} 

Lorsque ce sous est appelé à partir d'un script de test (qui va de la ligne de commande) qui utilise la même configuration fichier et fait tous les mêmes choses que le script CGI, aucune erreur n'est trouvée et le fichier est placé correctement. Lorsque le sous-élément est appelé depuis mon script CGI, le script affiche le répertoire $ tar. "/". $ Filename mais pas "Le fichier a été placé \ n" et les sorties du message ftp-> "Impossible de changer le répertoire." Ce qui semble provenir de la ligne cwd avant elle.

Autres informations: J'ai essayé d'exécuter le script de test en tant qu'utilisateur multiple avec le même résultat. J'utilise strict et avertissements. Le fichier tar en cours de déplacement est créé par le script.

Je suis nouveau à Perl donc tout conseil est utile parce que je suis bloqué sur ce point et ne peux pas trouver de l'aide en utilisant la puissance de Google.

+0

Il semble que votre serveur Web n'ait pas l'autorisation de lire $ tar_directory. – gangabass

+0

Les autorisations de dossier pour le répertoire spécifique permettent à tous les utilisateurs de lire le dossier. Cela échouerait-il si les répertoires supérieurs n'avaient pas les permissions? – wDroter

+0

Il peut échouer si les répertoires supérieurs n'ont pas les autorisations suffisantes. – Sorpigal

Répondre

0

Juste une supposition. Votre ftp-> put est défaillant, ce qui déclenche le dé. Sauf si vous avez:

use CGI::Carp qw(carpout fatalsToBrowser); 

vous ne verrez pas le message de die dans votre navigateur. Depuis que vous êtes mort, vous ne voyez pas la déclaration d'impression finale non plus.

Vérifiez le journal de votre serveur Web pour la sortie de die, ou changez simplement "die" pour "print".

+0

J'ai utiliser CGI :: Carp qw (warningsToBrowser fatalsToBrowser); – wDroter

+0

Hmmm ... Ok, je parie encore que put() échoue. Changez ce die en une impression. – jimtut

0

Net::FTP peut put() d'un descripteur de fichier ainsi qu'un nom de fichier:

open my $fh, '<', $tar_directory . '/' . $filename or die "Could not open file: $!"; 
$ftp->put($fh, $filename) or die "cannot put file ", $ftp->message; 

Si le problème est de votre côté, la open devrait échouer et vous devriez obtenir un message d'erreur de quelque sorte que, nous l'espérons , dites-vous ce qui ne va pas; Si le problème est sur le côté distant, le put devrait échouer et vous verrez la même chose que vous voyez maintenant.

Que $ftp->message a seulement le message de succès du cwd indique que tout va bien sur le côté distant et le put n'atteint même pas le serveur distant.

Questions connexes