Go 检测文件内容类型

有时候需要检测文件的内容类型或 MIME 类型,为此,需要打开文件并读取前512个字节(因为DetectContentType()函数值使用前512个字节),所以不需要读取更多内容。这个函数会返回一个 MIME 类型,如 application/json 或 image/jpeg。

package main

import (
	"fmt"
	"net/http"
	"os"
)

func main() {
	fileArr := []string{"file/1.pdf", "file/2.jpg", "file/3.docx", "file/4.xml", "file/5.azw3", "file/6.zip", "file/7.torrent"}

	for _, fileName := range fileArr {

		f, err := os.Open(fileName)
		if err != nil {
			panic(err)
		}
		defer f.Close()

		contentType, err := getFileContentType(f)
		if err != nil {
			panic(err)
		}

		fmt.Print(fmt.Sprintf("File Name : %v, Content Type : %s\n", fileName, contentType))
	}
}

func getFileContentType(out *os.File) (string, error) {
	buffer := make([]byte, 512)

	_, err := out.Read(buffer)
	if err != nil {
		return "", err
	}

	contentType := http.DetectContentType(buffer)

	return contentType, nil
}