net/httpパッケージを使えば良い
net/httpのDetectContentType関数を使うと楽だ。
実装はここ。
例
標準入力からファイルを読み込み、MIME Typeを出力する簡易なスクリプトを書く。
mime.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
bytes, err := ioutil.ReadAll(os.Stdin)
if err != nil {
panic(err)
}
mimeType := http.DetectContentType(bytes)
fmt.Printf("MIME Type: %s\n", mimeType)
}
試す
goのソースコード
./mime < mime.go
MIME Type: text/plain; charset=utf-8
バイナリファイル
./mime < mime
MIME Type: application/octet-stream
htmlファイル
./mime < test.html
MIME Type: text/plain; charset=utf-8
bmpファイル
./mime < test.bmp
MIME Type: image/bmp
jpegファイル
./mime < test.jpg
MIME Type: image/jpeg
pdfファイル
./mime < test.pdf
MIME Type: application/pdf
wav
./mime < test.wav
MIME Type: audio/wave
mp3
./mime < test.mp3
MIME Type: application/octet-stream
mp4
./mime < test.mp4
MIME Type: application/octet-stream
使用感
magicコマンド程ではないにせよ
こういうライブラリをGoは包含してるのはいいと思う。
自己完結ライブラリで作り上げれば、クロスコンパイル楽だし。
ただ、バイナリに関してはほぼ推測されない。そのため、
magicコマンド相当のものが欲しければ、
magicmimeを使おう。
ただし、この場合は環境ごとにlibmagicをインストールし、
ライブラリとリンクできる状態にならなければならないため、
可搬性は低くなる。