[Perl] Récupérer le chemin de fichier

Récupérer le chemin de fichier [Perl] - Perl - Programmation

Marsh Posté le 09-08-2005 à 16:27:26    

Bonjour, j'aimerai récupérer le chemin complet d'un fichier pour faireun upload avec le CGI.
Voici mon code :
 
if (defined(param('ok_depos'))){
 
 print "On dépose le fichier<br />";
 
 $donnees = param('file');
 
 print "Dans donnees : ".$donnees,p;
 
 open(ORIGINAL,'C:/Test/test_jsExemple.html') || die "Impossible de d'ouvrir le fichier original"; #C'est ici que j'ai un problème, si je remplace le chemin par $donnees, je n'ai rien qui se passe
 
 open COPIE, ">".$value."/".$donnees;
 print "On arrive ici...",p;
 
 while (<ORIGINAL> ){
      print COPIE $_;
     }
 close(COPIE);
 close(ORIGINAL);
 
 print "Fichier déposé";
}
 
En fait, j'utilise Firefox, et param('file'), ne me retourne que le nom du fichier, or j'aurais besoin du chemin complet pour copier ce fichier sur le serveur.
Merci d'avance

Reply

Marsh Posté le 09-08-2005 à 16:27:26   

Reply

Marsh Posté le 09-08-2005 à 18:44:04    

et le chemin tu le connais? Pasque sinon on peu pas l'inventer si ton formulaire ne le connait pas. c'est donc du coté de ton formulaire d'upload qu'il faut regarder:
- esque 'file' doit contenir le chemin complet?
- esqu'un autre parametre le contient?

Reply

Marsh Posté le 09-08-2005 à 18:44:46    

deja test systematiquement la sortie de ton open:
 
open(COPIE, '>'....) || die "impossible d'ouvire le fichier: $!";

Reply

Marsh Posté le 10-08-2005 à 10:25:17    

Le truc c'est que le open marche, vu qu'il me créé un fichier la ou il faut avec le bon nom.
Le chemin du fichier je le vois dans mon formulaire quand utilise le <INPUT type=file...>.
Malheureusement quand je fais param('file'), sous firefox il ne me retourne que le nom du fichier, et je voudrais qu'il me retourne le chemin complet.
Or je veux qu'il soit compatible tout type de navigateur.

Reply

Marsh Posté le 10-08-2005 à 11:02:14    

si le fichier est copié c'est bien que le chemin complet est "$value/$donnees" non?

Reply

Marsh Posté le 10-08-2005 à 11:10:41    

Oui ça c'est le fichier copié sur le serveur. En fait ça le copie au bon endroit.
Dans le copie ayant pour filehandle ORIGINAL, c'est là que je n'arrive pas à récupérer le chemin du fichier que je veux uploader. En utilisant un input type=text, non? en hidden?
En tout cas, c'est vraiment ce =)=)"=)'à" de chemin qui me manque, si je le rentre en dur ça marche nickel chrome d'acier trempé ! Merc ide ton aide !

Reply

Marsh Posté le 10-08-2005 à 11:35:56    

je comprend pas trop ton histoire...
tu veux le chemin du fichier sur le post du client? pour koi faire?

Reply

Marsh Posté le 10-08-2005 à 11:39:45    

En gros je veux faire un copier coller ( ou un upload ), or pour y arriver je dois faire un :
 open FICHIER_CLIENT #et la j'ai le chemin contenu de le input file#
 open FICHIER_SERVEUR "Ici le chemin que le client a spécifié, mais ça c'est bon#
 
Donc voilà, je n'arrive pas à faire ce open du fichier client.
Merci

Reply

Marsh Posté le 10-08-2005 à 14:02:27    

c'est normal que tu ne puisse pas ouvire ce fichier: il est chez le client, et ton script s'execute sur le serveur!
Pour faire un upload il faut que le client t'envois le contenu de son fichier dans sa requete (dans le corps du POST).
Le module CGI gere ca.

Reply

Marsh Posté le 10-08-2005 à 14:12:50    

Oui mais avec la fonction  
$mavariable = param('file')  
normalement je récupère le nom de fichier, seulement le nom, je veux tout le chemin.
Sinon peux tu me mettre un exemple stp? Parce que la j'avoue que je suis perdu !

Reply

Marsh Posté le 10-08-2005 à 14:12:50   

Reply

Marsh Posté le 10-08-2005 à 14:59:11    

le chemin ne te servira à rien: tu ne PEUX PAS aller ouvrire le fichier toi meme sur le poste du client!
evidemment tu peux le faire si le serveur et le client sont sur la meme machine, mais j'imagine que ca n'est pas ce que tu veux...
 
donc comme tu ne peux pas toi meme faire un open sur ce fichier, c'est le client qui doit t'en envoyer le contenu. Tu aura alors ce contnu dans une variable que tu pourra ensuite printer vers ton fichier de destination sur ton serveur.
Regarde la doc du module CGI, tout est explique:
http://search.cpan.org/~lds/CGI.pm-3.11/CGI.pm

Reply

Marsh Posté le 10-08-2005 à 15:23:21    

Et comment je fais alors pour un upload? Aurais tu un srcipt dispo sous la main? Sinon c'est pas grave, merci bien !

Reply

Marsh Posté le 10-08-2005 à 15:34:13    

regarde le lien que je t'ai filé

Reply

Marsh Posté le 10-08-2005 à 15:37:14    

http://search.cpan.org/~lds/CGI.pm [...] LOAD_FIELD
 

Citation :

Different browsers will return slightly different things for the name. Some browsers return the filename only. Others return the full path to the file, using the path conventions of the user's machine. Regardless, the name returned is always the name of the file on the user's machine, and is unrelated to the name of the temporary file that CGI.pm creates during upload spooling (see below).


 
et just en dessous ils expliquent
 
en gros ton nom de fichier est en fait un filehandle perl, donc il te suffit de faire:
 
while my $line (<$donnees> ) {
  print OUTPUT $line;
}


Message édité par pospos le 10-08-2005 à 15:37:51
Reply

Marsh Posté le 10-08-2005 à 15:42:58    

Désolé d'être relou, mais ton script que tu m'as filé ne marche pas, il comprend pas le : while my $line...
Si t'avais un autre système avec un for each peut être, ou un truc dans le genre.
En tout cas merci.
La doc que tu m'as filé existe en français, mais ça ne marche pas chez moi.

Reply

Marsh Posté le 10-08-2005 à 15:52:20    

J'ai réalisé ça :
foreach my $line (<$donnees> ) {
    print COPIE $line;
 }
 
mais ça ne marche pas non plus, il me créé un fichier avec le bon nom, mais le fichier est vide.

Reply

Marsh Posté le 10-08-2005 à 16:36:27    

j'ai pas testé, c'etait juste pour te montrer
 
lit la doc (je t'ai filé le lien qui pointe DIRECTEMENT sur la bonne section) !!!!!

Reply

Marsh Posté le 10-08-2005 à 16:37:15    

Oui je l'ai lu la doc...Même en francais en plus. Mais ça ne marche pas, mon fichier créé est vide.

Reply

Marsh Posté le 10-08-2005 à 16:41:45    

Regarde dans la doc il mette faire ça :
#J'ai changé pour mettre mes noms de variables
#ici je récupère le nom du fichier
$donnees = param('file');
 
 # Read a text file and print it out
        while (<$donnees> ) {
           print;
        }
 
 # Copy a binary file to somewhere safe
        open (COPIE,">>".$value."/".$donnees);
        while ($bytesread=read($donnees,$buffer,1024)) {
           print COPIE $buffer;
        }
 
Mais mon fichier est toujours vide...
$donnees ne m'affiche rien, pour moi en faisant print $donnees, j'obtiens le nom du fichier.
Et au final le fichier créé est vide.

Reply

Marsh Posté le 10-08-2005 à 16:54:46    

en dessous ils expliquent une autre method pour chopper le handler
 
et puis met un "use strict;" dans ton code

Reply

Marsh Posté le 11-08-2005 à 10:29:58    

Ouai je comprends que je ne récupère qu'une chaine de caractère et donc j'utilise $donnees = upload('file');
Mais je n'arrive pas à utiliser la suite, je ne comprends pas trop. Merci de ton aide

Reply

Marsh Posté le 11-08-2005 à 10:54:59    

Je ne récupère rien dans mon filehandle...
Voilà la suite de mon code pourtant :
open (COPIE,">".$value."/".$donne);
        while ($bytesread=read($donnees,$buffer,1024)) {
           print COPIE $buffer;
        }
 
avec $donne = param('file');
 
J'ai donc toujours un fichier vide de créé.

Reply

Marsh Posté le 11-08-2005 à 14:30:15    

Bon ben, si quelqu'un à un petit script perl pour uploader des fichiers?
Je n'y arrive pas malgré tout ce que j'ai pu trouvé, merci !


Message édité par neo00neo le 11-08-2005 à 14:30:40
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed