Nom de fichier au téléchargement

Nom de fichier au téléchargement - PHP - Programmation

Marsh Posté le 16-10-2007 à 10:19:58    

Bonjour,
 
Voici en deux mots la situation:
Je développe actuellement un intranet dans lequel nous mettons à disposition de l'utilisateur, des documents PDF.
l'arborescence est la suivante :

Code :
  1. htdocs
  2.    |
  3.    |_ Dev
  4.    |_ Prod
  5.    |_ Dossier PDF


 
Les url de développement et de production pointent respectivement sur les dossier Dev et Prod.
Le dossier contenant les PDF n'étant donc pas sous la racine, je ne peux faire de lien directe.
Le but premier est de permettre la visualisation des PDF, et au besoin de les télécharger.
 
Pour la visualisation, aucun soucis. J'utilise la fonction PHP 'readfile()', avec un header(' Content-type: application/pdf').
Mon problème vient lorsque l'on veut télécharger le fichier.
Le nom qui est par défaut, est l'url de la page PHP qui ouvre le fichier. C'est un peu logique en soi, mais il serait mieux que ce soit le nom du fichier qui s'y retrouve.
Seulement, je ne trouve pas comment lui passer cette information. Je n'ai pas trouvé de header qui corresponde à ça, ni d'autre fonction PHP qui ferait ceci.
 
Le seul header permettant de nommer le fichier, que j'ai trouvé est
'Content-Disposition: attachement; filename= ...'
Mais il force le téléchargement, ce qui ne me convient pas.
 
Je solicite donc votre connaissance sans doute plus avancée que la mienne pour ceci :)
 
Merci d'avance
 
L'intranet tourne sur un serveur Linux, avec PHP 5.2 et est développé avec le Framework de Zend.

Reply

Marsh Posté le 16-10-2007 à 10:19:58   

Reply

Marsh Posté le 16-10-2007 à 10:22:33    

bonjour,
euh basename()  
http://fr3.php.net/manual/fr/function.basename.php
 
ça t'irais pas?

Reply

Marsh Posté le 16-10-2007 à 10:28:10    

Le nom du fichier je le connais.
Mon soucis, c'est que dans la boite de dialogue de téléchargement de fichier, le nom de fichier par défaut qui est entré par IE ou Firefox, est l'url et non le nom réèl du fichier. Ce qui n'est pas très 'user friendly'...

Reply

Marsh Posté le 16-10-2007 à 10:29:24    

ah ok désolé j'avais pas compris ça ...
Fait une recherche sur le forum il me semble qu'il y à déjà eu quelques topics parlant de ça .. :)

Reply

Marsh Posté le 16-10-2007 à 11:52:51    

Effectivement ce soucis a été soulevé une ou deux fois, mais aucune réponse :s

Reply

Marsh Posté le 16-10-2007 à 14:55:00    

Normallement, en utilisant les en-têtes http, ça devrait le faire. J'envoie ça :
 

Code :
  1. FCGX_FPrintF(fcgi_out, "Content-Length: %d\r\n", sz);
  2. FCGX_FPrintF(fcgi_out, "Content-Disposition: inline; filename=\"preview.pdf\"; size=%d\r\n", sz);
  3. FCGX_FPrintF(fcgi_out, "Content-Type: application/pdf\r\n" );
  4. FCGX_FPrintF(fcgi_out, "Pragma: no-cache\r\n\r\n" );


Reply

Marsh Posté le 16-10-2007 à 15:37:45    

tpierron a écrit :

Normallement, en utilisant les en-têtes http, ça devrait le faire. J'envoie ça :
 

Code :
  1. FCGX_FPrintF(fcgi_out, "Content-Length: %d\r\n", sz);
  2. FCGX_FPrintF(fcgi_out, "Content-Disposition: inline; filename=\"preview.pdf\"; size=%d\r\n", sz);
  3. FCGX_FPrintF(fcgi_out, "Content-Type: application/pdf\r\n" );
  4. FCGX_FPrintF(fcgi_out, "Pragma: no-cache\r\n\r\n" );




 
2 possibilités pour enregistrer un document pdf:
 - Par le navigateur : Fichier -> enregistrer sous
 - Par le plugin Adobe reader intégré à la page : bouton 'Enregistrer une copie [tite disquette]'
 
Manifestement, le header 'Content-Disposition: inline; filename=....' fait bien ce que je veux,
malheureusement, ça ne fonctionne que si l'on télécharge par le navigateur, et uniquement sur Firefox :/
 
Tout le monde s'en doute, mais je le dis quand même, la majorité des utilisateurs seront sur MSIE  :cry:  
 
 
Voici concrètement mon code PHP:

Code :
  1. $file = $_GET['file'];
  2.  $file = '../Doc Pdf'.$file;
  3.  $filename = ereg_replace('.*/','',$file);
  4.  header('Content-type: application/pdf');
  5.  header('Content-Disposition:inline; filename="'.$filename.'" size='.filesize($file));
  6.  header('Pragma: no-cache');
  7.  readfile($file);

Reply

Marsh Posté le 16-10-2007 à 16:29:12    

Effectivement, je n'ai pas testé avec le plugin Acrobat Reader (j'utilise Foxit, acroread est vraiment trop B.L.O.A.T.). Cela dit, avec IE7, j'ai bien le nom du fichier (preview.pdf) qui s'affiche et non le CGI. Pourrais-tu faire un dump de l'entête HTTP qui est effectivement envoyé (firebug sait faire ça).
 
Sinon, pour les navigateurs recalcitrant, il faut passer par de l'URL rewriting (mod_rewrite sous Apache). Genre, tu te démerdes pour que le nom du fichier apparaîsse dans le dernier composant d'une URL.
 
Puis tu réécris cette URL en ce que tu veux via une RewriteRule. Ça force à croire que le fichier s'appelle "nom_du_fichier.pdf". Cela dit, c'est BoUrRiN et casse gueule, j'essaierais de faire fonctionner la méthode avec les entêtes http.

Reply

Marsh Posté le 16-10-2007 à 16:41:59    

Request Header:

Code :
  1. Host intradev.XXXX.be
  2. User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
  3. Accept text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
  4. Accept-Language fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
  5. Accept-Encoding gzip,deflate
  6. Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
  7. Keep-Alive 300
  8. Proxy-Connection keep-alive
  9. Referer http://intradev.XXXXX.be/intra/Fil [...] ren&token=
  10. Cookie PHPSESSID=8f33q0b72815o8t4i0fqq61mu5


 
Response Header:

Code :
  1. Content-Type application/pdf
  2. Date Tue, 16 Oct 2007 14:36:08 GMT
  3. Server Apache/2.2.3 (Unix) mod_ssl/2.2.3 OpenSSL/0.9.8d Zend Core/2.0.1 PHP/5.2.1
  4. X-Powered-By Zend Core/2.0.1 PHP/5.2.1
  5. Expires Thu, 19 Nov 1981 08:52:00 GMT
  6. Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  7. Pragma no-cache
  8. content-disposition inline; filename="2.2.1. Releves financiers. juin02.pdf" size=101121


Si tu connais un plugin pour avoir les headers sur MSIE, je veux bien ;) j'utilise 'IE Developper Toolbar', mais il n'a pas cette fonction.
Je développe l'intranet avec Zend Framework, qui fait déja de l'url rewriting.
L'url est de type "module/fichierphp/fonctionphp?file=path/to/file.pdf"
exemple:
  http://intradev.XXXXX.be/intra/Fil [...] e?file=...
 
"path/to/file.pdf" est un chemin relatif au dossier contenant les PDF.
 
d'où mon code PHP

Code :
  1. # $file = $_GET['file'];
  2. #  $file = '../Doc Pdf'.$file;


Message édité par Xilhion le 16-10-2007 à 16:44:27
Reply

Marsh Posté le 16-10-2007 à 17:15:27    

Euh, je vois quelques erreurs dans l'entête http (Response header - request on s'en fout). Primo, je pense que tu as fais un copier coller de Firebug, d'où l'absence des ":". En fait on s'en fout aussi d'où l'entête a été récupéré, puisqu'il est généré coté serveur, que ce soit IE ou FF, ça devrait être la même chose. C'est juste un peu difficile à lire.
 
Deuxio, pour le paaramètre "Content-Disposition:" il manque un ; à la fin du nom de fichier (avant size=...).
 
Sinon, je ne pense pas que ça influ, mais rajoute toujours un petit "Content-Length" (même valeur que size).

Reply

Marsh Posté le 16-10-2007 à 17:15:27   

Reply

Marsh Posté le 17-10-2007 à 08:31:43    

tpierron a écrit :

Euh, je vois quelques erreurs dans l'entête http (Response header - request on s'en fout). Primo, je pense que tu as fais un copier coller de Firebug, d'où l'absence des ":". En fait on s'en fout aussi d'où l'entête a été récupéré, puisqu'il est généré coté serveur, que ce soit IE ou FF, ça devrait être la même chose. C'est juste un peu difficile à lire.
 
Deuxio, pour le paaramètre "Content-Disposition:" il manque un ; à la fin du nom de fichier (avant size=...).
 
Sinon, je ne pense pas que ça influ, mais rajoute toujours un petit "Content-Length" (même valeur que size).


 
Oui j'utilise Firebug ^^, désolé pour les ':'
 
Mon entête est plus propre, mais rien n'a bougé au niveau de mon soucis :/
 
Header:

Code :
  1. Proxy-Connection: Keep-Alive
  2. Content-Length: 92229
  3. Content-Type: application/pdf
  4. Date: Wed, 17 Oct 2007 06:25:24 GMT
  5. Server: Apache/2.2.3 (Unix) mod_ssl/2.2.3 OpenSSL/0.9.8d Zend Core/2.0.1 PHP/5.2.1
  6. X-Powered-By: Zend Core/2.0.1 PHP/5.2.1
  7. Expires: Thu, 19 Nov 1981 08:52:00 GMT
  8. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  9. Pragma: no-cache
  10. content-disposition: inline; filename="10.2 Procedure en cas d'incendie.pdf"; size=92229
  11. Keep-Alive: timeout=5, max=100


 
La syntaxe au niveau de filename="xxx.pdf" est correcte ? (double quote, espace ?)
Il n'y aurait pas un header qui permette de définir un titre pour la page ?
 
IE et FF ne l'interprète p-e pas de la même façon, ou ne l'encode pas de la même façon...
(j'ai déjà eu un soucis d'encodage de la source JS sur IE, qui faisait bug mon script à cause d'un accent dans un commentaire...)


Message édité par Xilhion le 17-10-2007 à 08:34:12
Reply

Marsh Posté le 17-10-2007 à 16:09:28    

Rhââaa, mais c'est pas possible. Que le plugin acrobat ne prenne pas en compte le Content-disposition, ça me paraît normal (le flux http est transmis au plugin). Mais IEv7 (la version que j'ai) devrait en tenir compte.
 
Ça c'est l'entête que j'ai envoyé au navigateur :
 

Content-Length: 333773
Content-Disposition: inline; filename="10.2 Procedure en cas d'incendie.pdf"; size=333773
Content-Type: application/pdf
Pragma: no-cache


 
Dans Foxit avec FF, le nom du fichier était bien "10.2 Procedure en cas d'incendie.pdf". Avec IE7, j'avais "10.2_Procedure_en_cas_d'incendie.pdf". Mon CGI s'appelle "/cgi-bin/planner".
 
Pour l'encodage, normallement tu peux rajouter "; charset=XYZ" à la fin de Content-Type. Cela dit, je ne suis pas sûr que ça s'applique à l'entête HTTP. Le plus sûr étant de se limiter à du us-ascii (dans l'entête). Sinon les JS sont supposés avoir le même encodage que la page HTML (Content-Type de la requète http ou balise meta http-equiv).
 
Désolé, je sèche  :??:

Reply

Marsh Posté le 11-03-2009 à 11:39:49    

Bonjour,
je relance le sujet car il n'est pas résolu et je rencontre le même problême en java.
Dans mon cas le ftp n'est pas envisageable.
Je pointe vers un serveur Tomcat avec des paramètres. Le serveur retourne un pdf qui doit s'ouvrir dans le navigateur à l'aide du plugin adobe.
Lorsque je veux enregistrer le fichier, le nom proposé est celui de l'URL. Pourtant le filename arrive bien dans le Header.
 
Je n'ai pas le problème quand je déclenche le choix "ouvrir,enregistrer, annuler" avec le paramètre "attachment" dans le header "Content-Disposition"
 
L'Url rewriting ne semble pas non plus répondre à mon besoin puisqu'il se paramètre dans du xml, or moi j'ai le nom du fichier en dynamique dans mon code java.
 
merci
 
Barny

Reply

Sujets relatifs:

Leave a Replay

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