Хром
Хром (версия 38, как письма) имеет 3 способа, чтобы определить тип MIME и делает это в определенном порядке. Ниже приведен фрагмент из файла src/net/base/mime_util.cc
, метод 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.
жестко закодированный списки приходят немного ранее в файле: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 (kPrimaryMappings
и kSecondaryMappings
).
Пример: при загрузке CSV-файла из системы Windows с установленным Microsoft Excel Chrome сообщит об этом как application/vnd.ms-excel
. Это связано с тем, что .csv
не указан в первом жестко запрограммированном списке, поэтому браузер возвращается в системный реестр. HKEY_CLASSES_ROOT\.csv
имеет значение Content Type
, которое установлено на application/vnd.ms-excel
.
Internet Explorer
Снова используя тот же самый пример, браузер сообщит application/vnd.ms-excel
. Я думаю, что разумно предположить, что Internet Explorer (версия 11 на момент написания) использует реестр. Возможно, он также использует жесткий список, например Chrome и Firefox, но его закрытая природа источника затрудняет проверку.
Firefox
Как указано в коде Chrome, Firefox (версия 32 в письменной форме) работает аналогичным образом. Отрывок из файла uriloader\exthandler\nsExternalHelperAppService.cpp
, метод 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
жестко закодированные списки приходят раньше в файле, где-то возле линии 441. Вы ищете defaultMimeEntries
и extraMimeEntries
.
С моим текущим профилем браузер сообщит text/csv
, потому что есть запись для него в mimeTypes.rdf
(пункт 2 в списке выше). С новым профилем, который не имеет этой записи, браузер сообщит application/vnd.ms-excel
(пункт 3 в списке).
Резюме
жестко закодированные списки в браузерах довольно ограничены. Часто тип MIME, отправленный браузером, будет сообщен ОС. И именно поэтому, как указано в вопросе, тип MIME, о котором сообщает браузер, ненадежен.
application/octet-stream обозначает двоичный файл.Вы должны иметь возможность получить расширение файла, чтобы узнать, является ли он zip-файлом. Просто, чтобы уточнить, это работало для вас в FF, но не для вашего коллеги? –
да, это сработало для меня в обоих браузерах – Kip
взглянуть на атрибуты 'input/@ formenctype'или' form/@ enctype' – tuxSlayer