MIME 類型簡介
MIME 直譯的意思是多功能互聯(lián)網(wǎng)郵件擴(kuò)展,它是一套描述消息內(nèi)容類型(即文件的媒體類型)的因特網(wǎng)標(biāo)準(zhǔn)。從名字不難理解,MIME 設(shè)計的最初目的,是為了在發(fā)送電子郵件時附加多媒體數(shù)據(jù),讓郵件客戶程序能根據(jù)其類型進(jìn)行處理。發(fā)展到現(xiàn)在,被 HTTP 協(xié)議支持之后,它使得在互聯(lián)網(wǎng)傳輸?shù)膬?nèi)容不僅是普通的文本,還可以是圖像、音頻、視頻等表現(xiàn)力更加豐富的內(nèi)容。
MIME 消息可以包含文本、圖像、音頻、視頻以及其他應(yīng)用程序?qū)S玫臄?shù)據(jù)(如:Adobe Photoshop 應(yīng)用程序)。每個 MIME 類型由兩部分組成,由 / 分隔。前面是數(shù)據(jù)的大類別,例如 text(文本)、image(圖象)、audio(聲音)等;在后面定義具體的種類。如:text/javascript,image/png,audio/midi 都是合法且常見的 MIME 類型。
Internet 中有一個專門的組織 IANA(互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))來確認(rèn)標(biāo)準(zhǔn)的 MIME 類型,通常,只有一些在互聯(lián)網(wǎng)上獲得廣泛應(yīng)用的格式才會獲得一個 MIME Type。但互聯(lián)網(wǎng)發(fā)展的太快,很多應(yīng)用程序等不及 IANA 將他們使用的 MIME 類型納入標(biāo)準(zhǔn)類型。因此,他們使用在類別中以 application/x-*** 開頭的方法來標(biāo)識這個類別還沒有成為標(biāo)準(zhǔn),例如:x-gzip,x-tar 等。事實上,這些類型運(yùn)用廣泛,已經(jīng)成為了事實標(biāo)準(zhǔn)。只要客戶端和服務(wù)器端共同承認(rèn)這個 MIME 類型,即使它是不標(biāo)準(zhǔn)的類型也沒有關(guān)系,客戶端程序就能根據(jù) MIME 類型,采用對應(yīng)的處理方式來處理數(shù)據(jù)。
官方的 MIME 信息是由 IETF (Internet Engineering Task Force) 組織管理和維護(hù)。
主流編程語言獲取文件 MIME 的方法
PHP
作為全世界最好的編程語言,PHP 獲取文件 MIME 方法如下:
// 獲取文件 MIME 類型
function get_mime_type($file) {
if (function_exists('finfo_open')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $file);
finfo_close($finfo);
} else {
$mimetype = mime_content_type($file);
}
if (empty($mimetype)) {
$mimetype = 'application/octet-stream';
}
return $mimetype;
}
Javascript
Javascript 作為使用最廣泛的腳本語言之一,在客戶端驗證文件類型是一種常見的場景。下面是通過 JS 查看文件類型的方法。
首先,在頁面上定義一個文件上傳控件:
<input type="file" id="fileUploader" multiple>
獲取文件類型方法如下:
// 獲取上傳控件
var uploader = document.getElementById("fileUploader");
// 監(jiān)聽上傳控件的 change 事件
uploader.addEventListener("change", function(event) {
var files = uploader.files,
for (var i = 0; i < files.length; i++) {
console.log("文件名:" + files[i].name);
console.log("文件類型" + files[i].type);
console.log("文件大小" + files[i].size + " 字節(jié)");
}
}, false);
Java
Java 是目前最流行的后端編程語言,通過 Java 獲取文件 MIME 類型有多種方式,介紹如下。
1、在 Java 7(及其以上版本),可以這樣獲取:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Test {
public static void main(String[] args) throws IOException {
Path source = Paths.get("c:/temp/bady.png");
// 將輸出 image/png
System.out.println(Files.probeContentType(source));
}
}
2、使用 javax.activation.MimetypesFileTypeMap 對象獲取 MIME 類型
import javax.activation.MimetypesFileTypeMap;
import java.io.File;
class GetMimeType {
public static void main(String args[]) {
File f = new File("loading.gif");
// 將輸出 image/gif
System.out.println(new MimetypesFileTypeMap().getContentType(f));
}
}
3、使用 java.net.URL 對象獲取 MIME 類型
import java.net.*;
public class FileUtils{
public static void main(String args[]) {
URL url = new URL("file://c:/your/path/cache/test.txt");
URLConnection uc = url.openConnection();;
String type = uc.getContentType();
// 將輸出 text/plain
System.out.println(type);
}
}
附:MIME 類型定義標(biāo)準(zhǔn)和出處
- RFC-822: 表示 ARPA 因特網(wǎng)文字信息
- RFC-2045 MIME Part 1:定義了因特網(wǎng)消息體格式
- RFC-2046 MIME Part 2:定義了媒體類型的 MIME Type
- RFC-2047 MIME Part 3:定義了非 ASCII 文本頭部擴(kuò)展
- RFC-2048 MIME Part 4:定義了應(yīng)用程序注冊標(biāo)準(zhǔn)
- RFC-2049 MIME Part 5:包含一致性準(zhǔn)則的說明和一些示例