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 タイプのリストに含まれていますが、正しく検出されません。どうすればいいですか?
A: 一部のファイル形式 (多くの場合、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 ファイルであるかどうかを確認することは価値があります。
ファイル全体がメモリに読み込まれるのを防ぐため、リーダーまたはファイルMIME タイプから検出する場合、入力のヘッダーのみを読み取るように制限されます。
階層構造のおかげで、共通の形式を最初に検索し、ファイル ヘッダーに限定することで、 MIME タイプは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 を参照してください。