Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1600 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Titre d'un script CGI Perl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Titre d'un script CGI Perl

n°1855207
Predicator
Posté le 25-02-2009 à 18:12:51  profilanswer
 

Bonsoir,
 
J'ai écris un petit script Perl qui permet de télécharger un fichier existant sur le serveur.
 
Tout fonctionne bien si ce n'est que le fichier télécharger a systématiquement le nom du fichier perl (filedl.pl)
 
Quelqu'un sait comment faire en sorte que le nom de fichier proposé à l'enregistrement soit bien celui du fichier original, et non celui du script perl ?
J'ai essayé d'ajouter la balise head avec title, mais comme on peut s'en douter, le type mime passe alors automatiquement en texte, et le contenu du fichier binaire est affiché dans le navigateur, au lieu d'être proposé à l'enregistrement.
 
Voici un extrait du code du script :
 

Code :
  1. # Création du CGI
  2. my $cgi = new CGI;
  3. my $file = $cgi->param("file" );
  4. # Type MIME
  5. my $mimetype = &get_mime_type($file);
  6. # Entêtes HTML
  7. print $cgi->header('Content-type: $mimetype; charset=utf-8');
  8. open(FILE, "<$file" ) or die "Cannot open $file"; 
  9. my @filedata = <FILE>; 
  10. close (FILE) or die "Cannot close $file"; 
  11. print @filedata

mood
Publicité
Posté le 25-02-2009 à 18:12:51  profilanswer
 

n°1855236
tpierron
Posté le 25-02-2009 à 20:42:08  profilanswer
 

Pour faire ça, en général j'envoie l'entête http suivant :

Content-Disposition: inline; filename="%s"; size=%d
Content-Length: %d
Content-Type: application/binary
 
<contenu du fichier>


Où tu remplaceras %d par la taille en octet du fichier et %s le nom du fichier.
 
Mais ça coince en général avec les caractères unicode > 127. Si tu as ce genre de caractères, va falloir sans doute passer par des RewriteRule.

n°1855238
couak
Posté le 25-02-2009 à 20:44:00  profilanswer
 

dans l'en-tête, il faut ajouter ca :

Code :
  1. print $cgi->header("Content-Disposition: attachment; filename=nomdetonfichier" );

n°1855392
Predicator
Posté le 26-02-2009 à 09:33:01  profilanswer
 

Merci des réponses. J'ai jonglé avec vos deux solutions pour voir, mais toujours rien. Dernière version en date :
 

Code :
  1. # Nom du fichier
  2. my $fname = $file;
  3. $fname =~ s/^.*\///;
  4. print $cgi->header('Content-Disposition: inline; filename="$fname"');


 
J'ai essayé le inline et le attachement, avec des guillemets autour du nom et sans.
 
Pour info, les noms de fichier sont en UNICODE.


Message édité par Predicator le 26-02-2009 à 09:33:15
n°1855669
Predicator
Posté le 26-02-2009 à 17:54:58  profilanswer
 

Bon, j'ai un peu tout essayé, cherché des choses sur le net, mais rien trouvé de fonctionnel. J'ai constaté qu'on ne pouvait pas appeler plusieurs fois "print cgi->header" sous peine d'avoir des problèmes. J'ai donc essayé de tout mettre en une fois, mais toujours sans résultat :
 

Code :
  1. my $fname = $file;
  2. $fname =~ s/^.*\///;
  3. my $mimetype = &get_mime_type($file);
  4. print $cgi->header('Content-type: $mimetype; charset=utf-8; Content-Disposition: inline; filename="$fname";');

n°1866357
Predicator
Posté le 26-03-2009 à 17:45:38  profilanswer
 

Je remonte le sujet, en espérant que quelqu'un connaisse la solution :/

n°1866385
couak
Posté le 26-03-2009 à 19:24:57  profilanswer
 

faut pas mettre le nom du fichier entre "

n°1866493
Predicator
Posté le 27-03-2009 à 10:08:51  profilanswer
 

J'avais du essayé, mais depuis le temps, j'ai réessayé au cas où, mais le résultat est toujours négatif. Le fichier qu'il tente de télécharger est toujours "monscript.pl"
 

Code :
  1. # Création du CGI
  2. my $cgi = new CGI;
  3. my $file = $cgi->param("file" );
  4. my $fname = $file;
  5. $fname =~ s/^.*\///;
  6. my $mimetype = &get_mime_type($file);
  7. print $cgi->header("Content-type: $mimetype; charset=utf-8; Content-Disposition: attachment; filename=$fname;" );


 
Le nom de fichier est bien correct, mais toujours rien :/

n°1866698
tpierron
Posté le 27-03-2009 à 14:20:23  profilanswer
 

Bah, chais pas ce que tu fais, mais avec un programme de ce type, ça_marche_chez_moi™ (IE, FF, Safari). Bref, va falloir débugguer les headers qui ta lib envoie, il y a des chances pour qu'ils soient pas bon.

Code :
  1. #!c:/Perl/bin/perl.exe
  2.  
  3. print "Content-type: hello/world\n";
  4. print "Content-Disposition: inline; filename=\"hello world !\"; size=11\n";
  5. print "Content-Length: 11\n\n";
  6.  
  7. print "Hello world";


n°1866745
Predicator
Posté le 27-03-2009 à 15:45:21  profilanswer
 

OK, j'ai pas mal galéré, mais ton code m'a permis de trouver la solution.
J'ai juste déplacé du code, enlevé l'usage de "cgi->header", et ça fonctionne.
À vrai dire, je ne comprends pas pourquoi ça ne marchait pas avant, et ça, j'aime pas.
 
En tout cas, il semblerait que ça génère une erreur quand on ne met pas la taille, ou quand la taille indiquée diffère de la taille réelle.
 
Merci pour votre aide.

mood
Publicité
Posté le 27-03-2009 à 15:45:21  profilanswer
 

n°1868397
fabrice91
Posté le 01-04-2009 à 16:50:36  profilanswer
 

Déjà tu avais une erreur dans cette ligne :
 

Code :
  1. print $cgi->header("Content-type: $mimetype; charset=utf-8; Content-Disposition: attachment; filename=$fname;" );


 
Sur la doc de CGI au cpan, on peut lire qu'il faut qu'au moins le premier argument commence par un tiret, de plus il s'agit d'un HASH passé en paramètre.
De plus il faut enlever le "Content" pour la clé donc elles s'appelleront respectivement -type et -disposition :
Donc la bonne écriture était :
 

Code :
  1. print $cgi->header( -type => "$mimetype; charset=utf-8", -disposition => "attachment; filename=$fname" );


 
Mais bon je dois avouer que j'ai aussi pris la solution du print "Content-Type" etc car la solution ci dessus ne fonctionne tout de même pas  :??:  
J'ai du me tromper quelque part en plus...

n°1868402
Predicator
Posté le 01-04-2009 à 17:04:14  profilanswer
 

Merci pour les précisions :)
J'avoue que j'ai eu pas mal de soucis avec la méthode $cgi->header...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Titre d'un script CGI Perl

 

Sujets relatifs
script de configuration reseau linuxscript pour modifier un xsl:for-each
.htaccess : empêcher l'exécution sauvage d'un scriptping en boucle dans script shell
Script avec TelnetRecherche script decoupe image a partir d'une interface
aide pour coder un petit scriptScript pour Rotation Bannière Adsense
[VBS] Script permettant de tester une connexion réseauScript DOS SMTP
Plus de sujets relatifs à : Titre d'un script CGI Perl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR