Chrome
Chrome (versión 38 como de la escritura) tiene 3 maneras de determinar el tipo MIME y lo hace en un orden determinado. El siguiente fragmento es del archivo src/net/base/mime_util.cc
, método MimeUtil::GetMimeTypeFromExtensionHelper
.
// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type. That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.
Las listas no modificables llegar un poco más temprano en el archivo: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 (kPrimaryMappings
y kSecondaryMappings
).
Un ejemplo: al cargar un archivo CSV desde un sistema Windows con Microsoft Excel instalado, Chrome informará esto como application/vnd.ms-excel
. Esto se debe a que .csv
no está especificado en la primera lista codificada, de modo que el navegador vuelve al registro del sistema. HKEY_CLASSES_ROOT\.csv
tiene un valor denominado Content Type
que se establece en application/vnd.ms-excel
.
Internet Explorer
Otra vez usando el mismo ejemplo, el navegador informará application/vnd.ms-excel
. Creo que es razonable suponer que Internet Explorer (versión 11 al momento de escribir) utiliza el registro. Posiblemente también haga uso de una lista codificada como Chrome y Firefox, pero su naturaleza de código cerrado dificulta su verificación.
Firefox
Como se indica en el código de Chrome, Firefox (versión de 32 como de la escritura) funciona de una manera similar. Fragmento del archivo uriloader\exthandler\nsExternalHelperAppService.cpp
, método nsExternalHelperAppService::GetTypeFromExtension
// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category
Las listas no modificables vienen anteriormente en el archivo, en algún lugar cerca de la línea 441. Usted está buscando defaultMimeEntries
y extraMimeEntries
.
Con mi perfil actual, el navegador informará text/csv
porque hay una entrada para él en mimeTypes.rdf
(elemento 2 en la lista anterior). Con un perfil nuevo, que no tiene esta entrada, el navegador informará application/vnd.ms-excel
(elemento 3 en la lista).
Resumen
Las listas no modificables en los navegadores son bastante limitadas. A menudo, el tipo de MIME enviado por el navegador será el informado por el sistema operativo. Y esta es exactamente la razón por la cual, como se afirma en la pregunta, el tipo MIME informado por el navegador no es confiable.
application/octet-stream designa un archivo binario.Debería poder obtener la extensión del archivo para ver si es un archivo zip. Solo para aclarar, ¿esto funcionó para usted en FF, pero no en su compañero de trabajo? –
sí, funcionó para mí en ambos navegadores – Kip
eche un vistazo a los atributos 'input/@ formenctype'or' form/@ enctype' – tuxSlayer