在日常项目开发中,经常需要判断一个文件的类型,比如图片上传时,判断一个图片是否是jpgpng等。

如果单纯更改文件名的后缀取判断,这并不推荐,因为文件的后缀是可以随便修改的,如果是恶意程序伪装成.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
}

第三方库实现

在搜索的过程中,一不小心发现了这个第三方库,还不错,推荐一下!

https://github.com/h2non/filetype

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
}

学习永无止境!