Page 1 sur 1
Fonction "Enregistrer sous" et format .htm imposé
Posté : 01 sept. 2008, 10:38
par Ryle
Bonjour,
Un petit problème que je rencontre (avec IE) suite à la génération d'un fichier excel (XLS) : le clic droit sur un lien et le "Enregistrer sous" me propose d'enregistrer le fichier avec l'extension ".htm" au lieu de conserver le .xls du fichier

De même si je clic sur le lien pour ouvrir directement le fichier, celui-ci s'ouvre comme une page html et non un fichier excel...
Quelqu'un a-t-il une idée du pourquoi du comment de cette diabolique machination qui vise indubitablement à me déstabiliser politiquement ?!
A noter que :
- Si le fichier est récupéré en ftp, ou téléchargé et que l'extension est modifiée pour lui remettre du .xls, celui-ci s'ouvre correctement dans excel (donc le format est bon).
- le but n'est pas de forcer le téléchargement ou de trouver des solutions de contournement (du moins pas pour l'instant

) mais de comprendre ce qui se passe et de comprendre comment le navigateur fait pour estimer qu'il s'agit d'un fichier html et non xls pour potentiellement pouvoir corriger ?
Merci d'avance

Posté : 01 sept. 2008, 10:41
par @rthur
Salut Ryle,
As-tu vérifié dans les entêtes HTTP le content-type que te renvoies ton serveur pour ce fichier XLS?
Posté : 01 sept. 2008, 10:58
par Ryle
Hmm... j'ai jeté un coup d'oeil avec firebug pour voir ce que contenait l'entête (à noter que sous firefox ça marche bien) et j'ai po de content-type ?! C'est grave docteur ??
Code : Tout sélectionner
Response Headers
Etag W/"144384-1220258521718"
Last-Modified Mon, 01 Sep 2008 08:42:01 GMT
Content-Length 144384
Date Mon, 01 Sep 2008 08:42:31 GMT
Server Apache-Coyote/1.1
Code : Tout sélectionner
Request Headers
Host dev:8080
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Cookie JSESSIONID=37B7D16B335A581ADB46F10E6FF5F394
(ouais, je sais, c'est du java et pas du php, mais comme c'est plus une question de navigateur...)
Posté : 01 sept. 2008, 11:38
par @rthur
Je pense qu'en rajoutant un content-type ça devrait le faire:
header("Content-type: application/vnd.ms-excel");
Eh oh, tu crois pas que j'allais te donner le bout de code qui va bien en Java! On est sur PHPfrance quand même 
Posté : 01 sept. 2008, 16:36
par Ryle
Euh certes, mais mon soucis c'est que le fichier est préalablement généré physiquement sur le serveur.. donc mon lien c'est un bête href qui pointe directement vers le fichier xls et pas vers un script qui pourrait corriger le header....
Alors certes, je peux faire le script en question, mais l'idée était surtout de savoir quoi faire pour que le fichier dispose déjà du content-type ou de toute autre information permettant au navigateur de savoir directement que c'est de l'excel et pas une page html

Posté : 01 sept. 2008, 16:57
par Sékiltoyai
C'est à régler au niveau du serveur. Le serveur ya apache dans le nom mais c'est quoi exactement ?
Posté : 01 sept. 2008, 17:07
par dunbar
Euh certes, mais mon soucis c'est que le fichier est préalablement généré physiquement sur le serveur.. donc mon lien c'est un bête href qui pointe directement vers le fichier xls et pas vers un script qui pourrait corriger le header....
Alors je vais peut-être dire une connerie (
tu a l'habitude) mais pourquoi ne pas pointer vers un fichier vide qui lui aurait
header("Content-type: application/vnd.ms-excel");
header("Location: ton fichier");

Posté : 01 sept. 2008, 17:08
par chrislabricole
À vu de nez, je pencherai sur
AddType de Apache.
Sinon, c'est vrai
Server Apache-Coyote/1.1
Ça me parait bizarre

Posté : 01 sept. 2008, 17:33
par Sékiltoyai
Alors je vais peut-être dire une connerie (
tu a l'habitude) mais pourquoi ne pas pointer vers un fichier vide qui lui aurait
header("Content-type: application/vnd.ms-excel");
header("Location: ton fichier");

Content-Type s'applique au contenu de la page courante (dans ta solution une page vide), Location redirige vers un autre document. Le navigateur redemandera des headers et ne tiendra pas compte de ceux qui ont été envoyés précédemment. Donc il y a des chances non négligeables que ta solution n'en soit pas une…
Posté : 01 sept. 2008, 20:58
par Ryle
Le serveur c'est un vieux Tomcat (version 3.3 je crois) qui embarque un serveur web léger..
@dunbar : le principe est bon, même si comme le dis Sékil, ce n'est pas une redirection qu'il faut faire derrière mais la lecture du fichier. (en gros dire au navigateur qu'on lui envoi un flux xls et lui lire n'importe quel fichier ensuite qu'il traitera comme de l'excel).
Donc ce serait effectivement une solution envisageable, mais l'idée c'est surtout de comprendre pourquoi il ne parvient pas à le faire tout seul comme un grand
Je vais chercher du côté de "AddType", mais si ça venait de la conf du serveur j'aurais sans doute le même problème avec firefox nan ?
Merci de vos réponses en tout cas

Posté : 01 sept. 2008, 21:11
par Sékiltoyai
Il est fort probable que firefox matche l'extension de fichier si le content-type n'est pas fourni…
Je n'aurais pas dit AddType, mais dans les fichiers Mime. Sur Apache, tu as un module pour gérer le Mime, il faut voir si tu n'as pas un truc du même genre à activer sous TomCat…
Posté : 02 sept. 2008, 00:17
par Calimero
Deux choses :
1/ bien vérifier que le fichier généré est au format excel et non html

(oui, c'est con, mais il faut l'ouvrir dans un éditeur de texte pour en être sûr)
2/ Pour les mimetypes, ça devrait logiquement marcher,
MAIS les vieilles versions d'Internet Explorer savent ignorer le content-type quand ça les arrange. Se méfier donc, et en cas de souci revenir à 1/.
Posté : 02 sept. 2008, 10:15
par @rthur
Alors je vais peut-être dire une connerie (
tu a l'habitude) mais pourquoi ne pas pointer vers un fichier vide qui lui aurait
header("Content-type: application/vnd.ms-excel");
header("Location: ton fichier");

Content-Type s'applique au contenu de la page courante (dans ta solution une page vide), Location redirige vers un autre document. Le navigateur redemandera des headers et ne tiendra pas compte de ceux qui ont été envoyés précédemment. Donc il y a des chances non négligeables que ta solution n'en soit pas une…
Effectivement ça ne marchera pas mais l'idée est bonne:
header("Content-type: application/vnd.ms-excel");
print file_get_contents("ton fichier.xls");