2010-03-11 20 views
7

Estoy desarrollando una carga de archivos con JSF. La aplicación guarda tres fechas sobre el archivo:¿Cuándo los navegadores envían application/octet-stream como Content-Type?

  • Nombre de archivo
  • Bytes
  • Content-Type tal como fue presentado por el navegador.

Mi problema es que algunos archivos se guardan con el tipo de contenido = application/octet-stream incluso si son archivos *.doc oder *.pdf.

¿Cuándo el navegador envía dicho tipo de contenido?
Me gustaría limpiar la base de datos, así que necesito saber cuándo la información del navegador es incorrecta.

+1

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

+0

@Pointy: Desafortunadamente hay más navegadores en el mundo que solo FF. Por ejemplo, el desarrollado por (tos) un equipo en Redmond. – BalusC

+0

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

Respuesta

8

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.

2

Depende del sistema operativo, el navegador y cómo el usuario los ha configurado. Se basa en la forma en que el navegador determina el tipo de archivo de los archivos locales (para mostrarlos). En la mayoría de las combinaciones de OS/navegador esto se basa en la extensión del archivo, pero en algunos puede determinarse por otros medios. (p. ej .: en Mac OS)

En cualquier caso, no deberías confiar realmente en el tipo de contenido enviado por el navegador. El mejor enfoque sería mirar el contenido del archivo. Probablemente también pueda usar el nombre de archivo, pero tenga en cuenta que los navegadores no necesariamente serán buenos para decírselo (aunque probablemente todavía sea un lote más confiable que el tipo de contenido que envían).

Cuestiones relacionadas