mimetype
v1.4.7
go get github.com/gabriel-vasile/mimetype
mtype := mimetype . Detect ([] byte )
// OR
mtype , err := mimetype . DetectReader ( io . Reader )
// OR
mtype , err := mimetype . DetectFile ( "/path/to/file" )
fmt . Println ( mtype . String (), mtype . Extension ())
請參閱可運行的 Go Playground 範例。
僅使用mimetype等函式庫作為最後的手段。使用幻數進行內容類型偵測速度慢、不準確且不標準。大多數情況下,協定都有指定此類元資料的方法;例如,HTTP 和 SMTP 中的Content-Type
標頭。
Q:我的檔案位於支援的 MIME 類型清單中,但未正確偵測到。我該怎麼辦?
答:某些文件格式(通常是 Microsoft Office 文件)將其簽章保留在文件末尾。嘗試增加用於檢測的位元組數:
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
如果增加限制沒有幫助,請提出問題。
mimetype使用分層結構來保留 MIME 類型偵測邏輯。這減少了檢測文件類型所需的呼叫次數。這種選擇背後的原因是有些文件格式用作其他文件格式的容器。例如,Microsoft Office 檔案只是 zip 存檔,包含特定的元資料檔案。一旦文件被識別為 zip,就無需檢查它是否是文字文件,但值得檢查它是否是 Microsoft Office 文件。
為了防止將整個檔案載入記憶體中,當從讀取器或檔案中偵測時, mimetype限制自身僅讀取輸入的標頭。
由於分層結構,首先搜尋通用格式,並將自身限制為檔案頭, mimetype與 stdlib http.DetectContentType
的效能相匹配,同時優於替代套件。
mimetype http.DetectContentType filetype
BenchmarkMatchTar-24 250 ns/op 400 ns/op 3778 ns/op
BenchmarkMatchZip-24 524 ns/op 351 ns/op 4884 ns/op
BenchmarkMatchJpeg-24 103 ns/op 228 ns/op 839 ns/op
BenchmarkMatchGif-24 139 ns/op 202 ns/op 751 ns/op
BenchmarkMatchPng-24 165 ns/op 221 ns/op 1176 ns/op
請參閱 CONTRIBUTING.md。