5542 sujets

Sémantique web et HTML

Bonjour,
Je rencontre en ce moment un petit souci sous Internet Explorer (v11) qui s'obstine à ne pas vouloir télécharger une ressource Excel, en précisant que :
a) le header HTTP content-type transmis par le serveur spécifie bien la valeur "application/vnd.ms-excel", réputée "officielle" Microsoft (il semble qu'il y ait débat sur le sujet)
b) le lien hypertexte contenu sur la page HTML est du type suivant :
<a href="..." type="application/vnd.ms-excel" ...>...</a>

Tout fonctionne correctement sous Firefox, seul Internet Explorer affiche le contenu binaire du fichier Excel (pas vraiment cool...).
J'ai essayé plusieurs approches, notamment en ajoutant l'attribut @download puisque la page est servie en HTML5, mais le résultat reste le même.
Côté web, rien de bien concluant trouvé sur ce problème, hormis le conseil de passer le bon mime type.
Si quelqu'un a déjà rencontré ce dysfonctionnement ou fait preuve d'un éclair de génie, je suis preneur de toute piste.
Merci d'avance.
Modifié par sepecat (17 Feb 2017 - 05:50)
Administrateur
Suggestion : passer par un en-tête HTTP pour forcer le téléchargement

Content-Type: application/force-download


Par exemple en PHP avec un peu plus d'indications et en lisant le contenu du fichier à la suite des en-têtes :

$fichier = "bidule.xls";
header('Content-Type: application/octet-stream');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename='.basename($fichier));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Length: ' . filesize($fichier));
ob_clean();
flush();
readfile($fichier);


Ceci part du principe que c'est un script PHP qui est appelé dans le lien, et pas le fichier XLS directement, sinon il faut configurer ceci au niveau du serveur HTTP.
dew a écrit :
Suggestion : passer par un en-tête HTTP pour forcer le téléchargement
Content-Type: application/force-download

Par exemple en PHP avec un peu plus d'indications et en lisant le contenu du fichier à la suite des en-têtes :
$fichier = "bidule.xls";
header('Content-Type: application/octet-stream');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename='.basename($fichier));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Length: ' . filesize($fichier));
ob_clean();
flush();
readfile($fichier);

Ceci part du principe que c'est un script PHP qui est appelé dans le lien, et pas le fichier XLS directement, sinon il faut configurer ceci au niveau du serveur HTTP.

Merci Dew pour cette suggestion éclairée et précise.
De fait, il s'agissait d'un développement pro et j'ai trouvé aujourd'hui où se situait le problème, lié à un header "content-type" non sérialisé.
Pour comprendre, il faut expliquer le contexte :
Il s'agit d'un développement Java créant des pages HTML et des contrôleurs HTTP pouvant être exploités indifféremment via un serveur Tomcat (Servlet), un serveur HTTP natif Java (HttpServer) ou encore un plugin Eclipse.
Chaque environnement repose sur une classe Java native, fournie par Apache (Tomcat HttpServlet), Sun (HttpServer / HttpExchange) ou Eclipse (plugin / AbstractPlugin), qu'il me faut donc utiliser telle quelle.
Le problème venait du fait que les headers étaient correctement initialisés dans la servlet, mais ne l'étaient pas sur la version HttpServer... Smiley rolleyes dysfonctionnement passé totalement inaperçu lorsque je testais sous Firefox, car ce navigateur semble plus fûté qu'IE et délivre les ressources demandées sans rechigner.
C'est en voulant implanter ta suggestion "application/force-download" que je suis tombé sur ce défaut de sérialisation.
Problème réglé donc, et je vais en profiter pour creuser un peu la valeur d'attribut que tu m'indiques, que je ne connaissais pas, et qui pourrait être intéressante à implémenter dans mon générateur HTML perso.
Merci en tout cas pour ton intervention.