Trình duyệt Chrome
Chrome (phiên bản 38 tính đến thời điểm viết bài) có 3 cách để xác định kiểu MIME và làm như vậy theo một thứ tự nhất định. Đoạn mã dưới đây là từ tệp src/net/base/mime_util.cc
, phương pháp 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.
Danh sách được mã hóa cứng xuất hiện sớm hơn một chút trong tệp: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings
và kSecondaryMappings
).
Ví dụ: khi tải lên tệp CSV từ hệ thống Windows có cài đặt Microsoft Excel, Chrome sẽ báo cáo điều này là application/vnd.ms-excel
. Điều này là do .csv
không được chỉ định trong danh sách được mã hóa cứng đầu tiên, vì vậy trình duyệt rơi trở lại sổ đăng ký hệ thống. HKEY_CLASSES_ROOT\.csv
có một giá trị được đặt tên Content Type
là application/vnd.ms-excel
.
trình duyệt web IE
Một lần nữa sử dụng cùng một ví dụ, trình duyệt sẽ báo cáo application/vnd.ms-excel
. Tôi nghĩ rằng thật hợp lý khi giả sử Internet Explorer (phiên bản 11 khi viết) sử dụng sổ đăng ký. Có thể nó cũng sử dụng một danh sách được mã hóa cứng như Chrome và Firefox, nhưng bản chất nguồn đóng của nó khiến rất khó để xác minh.
Firefox
Như đã nêu trong mã Chrome, Firefox (phiên bản 32 khi viết) hoạt động theo cách tương tự. Đoạn mã từ tệp uriloader\exthandler\nsExternalHelperAppService.cpp
, phương thứcnsExternalHelperAppService::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
Các danh sách được mã hóa cứng xuất hiện sớm hơn trong tệp, ở đâu đó gần dòng 441. Bạn đang tìm kiếm defaultMimeEntries
và extraMimeEntries
.
Với hồ sơ hiện tại của tôi, trình duyệt sẽ báo cáo text/csv
vì có mục nhập cho hồ sơ đó mimeTypes.rdf
(mục 2 trong danh sách ở trên). Với hồ sơ mới, không có mục này, trình duyệt sẽ báo cáo application/vnd.ms-excel
(mục 3 trong danh sách).
Tóm lược
Danh sách được mã hóa cứng trong trình duyệt khá hạn chế. Thông thường, kiểu MIME do trình duyệt gửi sẽ là kiểu được Hệ điều hành báo cáo. Và đây chính là lý do tại sao, như đã nêu trong câu hỏi, kiểu MIME được trình duyệt báo cáo là không đáng tin cậy.