jsf - tipo - ¿Cuándo los navegadores envían application/octet-stream como Content-Type?
mime type zip (2)
Estoy desarrollando una carga de archivos con JSF. La aplicación guarda tres fechas sobre el archivo:
- Nombre del archivo
- Bytes
- Content-Type según lo enviado por el navegador.
Mi problema es que algunos archivos se guardan con content type = application/octet-stream
incluso si son *.doc
archivos 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.
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 determine usted mismo usando ServletContext#getMimeType()
.
String mimeType = servletContext.getMimeType(filename);
Los tipos de mime predeterminados se definen en el web.xml
del servletcontainer en cuestión. En, por ejemplo, Tomcat, está ubicado en /conf/web.xml
. Puede extenderlo / anularlo en /WEB-INF/web.xml
la /WEB-INF/web.xml
web 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 de mime basado en el contenido del archivo real (porque la extensión del archivo puede no ser precisa en sí misma, puede ser engañado 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. Puedes usarlo de la siguiente manera:
String mimeType = Magic.getMagicMatch(file, false).getMimeType();
Tenga en cuenta que no es compatible con todos los tipos mimet como confiables. También puede considerar una combinación de ambos enfoques. Por ejemplo, si uno devuelve null o application/octet-stream
, use el otro. O si ambos devuelven un tipo mimet diferente pero "válido", prefieren el que devuelve JMimeMagic.
Oh, casi me olvido de agregar, en JSF puedes obtener el ServletContext
siguiente manera:
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
O si ya usa JSF 2.x, use ExternalContext#getMimeType()
lugar.
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. (por ejemplo: en Mac OS)
En cualquier caso, no debería confiar realmente en el tipo de contenido enviado por el navegador. El mejor enfoque sería mirar el contenido del archivo. Probablemente también puedas usar el nombre del archivo, pero ten en cuenta que los navegadores no necesariamente serán buenos para decírtelo tampoco (aunque es probable que sea mucho más confiable que el tipo de contenido que envían).