Ignore la valeur envoyée par le navigateur. Cela dépend en effet de la plateforme client, du navigateur et de la configuration utilisée.
Si vous souhaitez un contrôle total sur les types de contenu en fonction de l'extension du fichier, mieux vaut le déterminer vous-même en utilisant ServletContext#getMimeType()
.
String mimeType = servletContext.getMimeType(filename);
Par défaut, les types MIME sont DÉFINIES dans le web.xml
du servletcontainer en question. Dans Tomcat par exemple, il est situé au /conf/web.xml
. Vous pouvez étendre/remplacer dans /WEB-INF/web.xml
de la webapp comme suit:
<mime-mapping>
<extension>xlsx</extension>
<mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>
Vous pouvez également déterminer le type MIME en fonction du contenu réel du fichier (car l'extension de fichier ne peut pas en soi être précis, il peut se laisser berner par le client), mais c'est beaucoup de travail. Pensez à utiliser une bibliothèque tierce pour faire tout le travail. J'ai trouvé JMimeMagic utile pour cela. Vous pouvez l'utiliser comme suit:
String mimeType = Magic.getMagicMatch(file, false).getMimeType();
Notez qu'il ne supporte pas tous mimetypes comme fiable. Vous pouvez également envisager une combinaison des deux approches. Par exemple. si l'un renvoie null ou application/octet-stream
, utilisez l'autre. Ou si les deux retournent un type MIME différent mais "valide", préférez celui retourné par JMimeMagic.
Oh, j'ai presque oublié d'ajouter, dans JSF, vous pouvez obtenir le ServletContext
comme suit:
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
Ou si vous arrive d'utiliser JSF 2.x déjà, utilisez ExternalContext#getMimeType()
à la place.
Hmm ... Je ne peux pas faire en sorte que Firefox utilise un mauvais type MIME même si je gâche le fichier mime.types de mon système, donc je ne sais pas ce que les navigateurs pourraient faire pour passer un en-tête Content-type. – Pointy
@Pointy: Malheureusement, il y a plus de navigateurs dans le monde que seulement FF. Par exemple celui développé par (toux) une équipe à Redmond. – BalusC
Oui bien sûr - curieusement, je m'attendrais à ce que IE obtienne le type MIME, mais pas de cette façon. (Je m'attendrais à ce qu'il fournisse "application/pdf" pour un fichier JPEG dont le nom est "bogus.pdf", par exemple.) – Pointy