Ignora el valor enviado por el navegador. De hecho, esto depende de la plataforma del cliente, el navegador y la configuración utilizada.
Si desea un control total sobre los tipos de contenido basados en la extensión de archivo, entonces mejor que lo determine usando ServletContext#getMimeType()
.
String mimeType = servletContext.getMimeType(filename);
los tipos MIME por defecto se definied en el web.xml
del servletcontainer en cuestión. En, por ejemplo, Tomcat, está ubicado en /conf/web.xml
. Se puede extender/anularlo en la aplicación web de /WEB-INF/web.xml
de la siguiente manera:
<mime-mapping>
<extension>xlsx</extension>
<mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>
También puede determinar el tipo MIME basado en el contenido real del archivo (debido a la extensión del archivo no puede por sí misma ser precisos, se puede engañar por el cliente), pero esto es mucho trabajo. Considere usar una biblioteca de terceros para hacer todo el trabajo. He encontrado JMimeMagic útil para esto. Se puede utilizar de la siguiente manera:
String mimeType = Magic.getMagicMatch(file, false).getMimeType();
Tenga en cuenta que no es compatible con todos los tipos MIME como fiable. También puede considerar una combinación de ambos enfoques. P.ej. si el devuelve nulo o application/octet-stream
, use el otro. O si ambos devuelven un tipo mimet diferente pero "válido", prefieren el que devuelve JMimeMagic.
Ah, se me olvidó añadir, en JSF se puede obtener el ServletContext
de la siguiente manera:
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
O si usted usa JSF 2.x ya, utilizar ExternalContext#getMimeType()
lugar.
Hmm ... No puedo hacer que Firefox utilice un tipo MIME incorrecto incluso si estropeo mi archivo mime.types del sistema, por lo que no estoy seguro de qué podrían estar haciendo los navegadores para pasar un encabezado Content-type. – Pointy
@Pointy: Desafortunadamente hay más navegadores en el mundo que solo FF. Por ejemplo, el desarrollado por (tos) un equipo en Redmond. – BalusC
Sí, por supuesto, por extraño que sea, esperaba que IE obtuviera el tipo MIME incorrecto, pero no de esa manera. (Esperaría que proporcionara "application/pdf" para un archivo JPEG cuyo nombre era "bogus.pdf", por ejemplo). – Pointy