轉載自:https://itbilu.com/nodejs/core/VJYaAfKrl.html
MIME,即:Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展類型。其主要用途是設置某種擴展名的文件的響應程序類型,我們可以認為是當指定擴展名文件被訪問時,瀏覽器會自動使用指定應用程序來打開。在HTTP中,是通過名為Content-Type的HTTP頭來設置或響應對應的文件類型的。例如:當服務器要向客戶端發送的內容圖類為.jpg圖片,就需要將Content-Type頭設置為image/jpeg,而客戶端同樣會根據Content-Type對服務器內容進行解析。
MIME和Content-Type是文件類型設置和解板的標准。當服務器要對某種擴展名文件發送到客戶端時,會根據文件擴展名設置Content-Type頭。而客戶端(可以認為是瀏覽器),對服務器內容進行解析時也需要Content-Type所代表的MIME找到內容的解析程序。MIME類型非常多,當我們在服務端設置發送內容格式時或當我們對服務端內容進行解析時,對幾百種MIME類型進行處理工作量會非常巨大。
推薦一個NPM包:mime。mime模塊使用Apache項目的mime.types文件,該文件包含了超過600個Content-Type類型數據,並且支持添加自定義的MIME類型。
1. mime安裝
mime模塊是一個基於mime-db的MIME類型解析及處理程序。
使用npm安裝模塊:
npm install mime
安裝后,mime模塊測試:
npm run test
mime模塊安裝后,可以命令行下使用(命令行下使用需要npm install -g全局安裝),格式如下:
mime [path_string]
如,mime模塊查看當前目錄下app.js文件的類型:
mime app.js
//application/javascript
2. mime模塊的查詢API
通過mime模塊可以通過文件及其擴展查詢與文件關聯的MIME類型,也可以通過MIME類型反向查找文件的擴展名。
2.1 查詢文件的類型mime.lookup(path)
使用mime模塊查詢文件的MIME類型:
var mime = require('mime');
mime.lookup('/path/to/file.txt'); // => 'text/plain'
mime.lookup('file.txt'); // => 'text/plain'
mime.lookup('.TXT'); // => 'text/plain'
mime.lookup('htm'); // => 'text/html'
mime.default_type返回默認類型
當通過mime.lookup()查找的文件MIME類型不存在時會返回application/octet-stream類型。mime.lookup()查找的文件時路徑不區分大小寫。可以通過mime.default_type返回當前使用的默認類型。
2.2 查詢文件護展名mime.extension(type)
mime模塊提供了查詢文件擴展名的方法,我們可以通過Content-Type所表示的MIME類型查找到文件的擴展名,並最終確認內容解析形式和解析程序。
mime.extension('text/html'); // => 'html' mime.extension('application/octet-stream'); // => 'bin'
2.3 查找類型編碼mime.charsets.lookup()
通過mime模塊可以查詢MIME類型所使用的編碼:
mime.charsets.lookup('text/plain'); // => 'UTF-8'
3. mime自定義類型
當mime模塊自帶的mime-db庫不存在或不能滿足我們所需的MIME類型時,還可以自定義MIME類型。
3.1 自定義類型mime.define()
mime.define(obj)
該方法接受一個參數obj,是一個表示mime類型/擴展名的對象。
mime.define({ 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], 'application/x-my-type': ['x-mt', 'x-mtt'], // etc ... }); mime.lookup('x-sft'); // => 'text/x-some-format'
3.2 加載類型文件mime.load(filepath)
mime模塊支持從一個Apache的mime.types文件加載MIME類型,相對於自定義類型,從現有文件中加載類型更為方便:
mime.load('./my_project.types');
