Titre d'un script CGI Perl

Titre d'un script CGI Perl - Perl - Programmation

Marsh Posté le 25-02-2009 à 18:12:51    

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

Reply

Marsh Posté le 25-02-2009 à 18:12:51   

Reply

Marsh Posté le 25-02-2009 à 20:42:08    

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.

Reply

Marsh Posté le 25-02-2009 à 20:44:00    

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

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

Reply

Marsh Posté le 26-02-2009 à 09:33:01    

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
Reply

Marsh Posté le 26-02-2009 à 17:54:58    

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";');

Reply

Marsh Posté le 26-03-2009 à 17:45:38    

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

Reply

Marsh Posté le 26-03-2009 à 19:24:57    

faut pas mettre le nom du fichier entre "

Reply

Marsh Posté le 27-03-2009 à 10:08:51    

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 :/

Reply

Marsh Posté le 27-03-2009 à 14:20:23    

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";


Reply

Marsh Posté le 27-03-2009 à 15:45:21    

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.

Reply

Marsh Posté le 27-03-2009 à 15:45:21   

Reply

Marsh Posté le 01-04-2009 à 16:50:36    

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...

Reply

Marsh Posté le 01-04-2009 à 17:04:14    

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

Reply

Sujets relatifs:

Leave a Replay

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