在日常项目开发中,经常需要判断一个文件的类型,比如图片上传时,判断一个图片是否是jpg
、png
等。
如果单纯更改文件名的后缀取判断,这并不推荐,因为文件的后缀是可以随便修改的,如果是恶意程序伪装成.jpg
图片上传,那会存在很大的安全隐患。
判断文件的真实类型就是获取文件的MIME类型,一般获取文件内容的前几个字节就可以确定它的MIME类型了。
那么在Go语言中如何获取MIME类型呢?在Go语言的标准库net/http
包下面有一个http.DetectContentType
,借助这个方法就可以获取文件的MIME类型了。
标准库实现
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
fi, err := os.Open("/path/videos/pkch.mp4")
if err != nil {
panic(err)
}
// 只需要前 512 个字节就可以了
buffer := make([]byte, 512)
_, _ = fi.Read(buffer)
contentType := http.DetectContentType(buffer)
fmt.Println(contentType) // video/mp4
}
第三方库实现
在搜索的过程中,一不小心发现了这个第三方库,还不错,推荐一下!
package main
import (
"fmt"
"os"
"github.com/h2non/filetype"
)
func main() {
fi, err := os.Open("/path/videos/pkch.mp4")
if err != nil {
panic(err)
}
// We only have to pass the file header = first 261 bytes
buffer := make([]byte, 261)
_, _ = fi.Read(buffer)
kind, _ := filetype.Match(buffer)
if kind == filetype.Unknown {
fmt.Println("Unknown file type")
return
}
fmt.Println(kind.MIME.Value) // video/mp4
}
学习永无止境!