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

  FORUM HardWare.fr
  Programmation
  PHP

  Nom de fichier au téléchargement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Nom de fichier au téléchargement

n°1624408
Xilhion
Posté le 16-10-2007 à 10:19:58  profilanswer
 

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.

mood
Publicité
Posté le 16-10-2007 à 10:19:58  profilanswer
 

n°1624413
micfont999
Simplement Moi
Posté le 16-10-2007 à 10:22:33  profilanswer
 

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

n°1624417
Xilhion
Posté le 16-10-2007 à 10:28:10  profilanswer
 

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

n°1624421
micfont999
Simplement Moi
Posté le 16-10-2007 à 10:29:24  profilanswer
 

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

n°1624566
Xilhion
Posté le 16-10-2007 à 11:52:51  profilanswer
 

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

n°1624744
tpierron
Posté le 16-10-2007 à 14:55:00  profilanswer
 

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


n°1624788
Xilhion
Posté le 16-10-2007 à 15:37:45  profilanswer
 

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

n°1624824
tpierron
Posté le 16-10-2007 à 16:29:12  profilanswer
 

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.

n°1624832
Xilhion
Posté le 16-10-2007 à 16:41:59  profilanswer
 

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
n°1624857
tpierron
Posté le 16-10-2007 à 17:15:27  profilanswer
 

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

mood
Publicité
Posté le 16-10-2007 à 17:15:27  profilanswer
 

n°1625142
Xilhion
Posté le 17-10-2007 à 08:31:43  profilanswer
 

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
n°1625665
tpierron
Posté le 17-10-2007 à 16:09:28  profilanswer
 

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

n°1860241
barny
Posté le 11-03-2009 à 11:39:49  profilanswer
 

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


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

  Nom de fichier au téléchargement

 

Sujets relatifs
PB de download de fichier sur serveur distant.[Résolu][SH-Sed] Supprimer une partie d'un fichier
Mauvaise manipe = comment supprimer un fichier ?Supression caractères dans nom fichier
Extraire une partie d'un fichier texte[résolu] Moteur de recherche interne avec fichier pdf
Extraire de données de fichier texte vers excel[VB6] Decompresser un fichier ZIP
[Java / Servlet] Nom de fichiers french-like sous linux[RESOLU]creation fichier txt
Plus de sujets relatifs à : Nom de fichier au téléchargement


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