Go语言中判断文件MIME类型主要使用net/http包的DetectContentType函数,通过读取文件前512字节进行推断,准确率高;示例代码展示了如何读取文件并调用该函数获取如image/png、application/pdf等类型;当无法读取内容时可退而求其次使用mime.TypeByExtension根据扩展名推测,但准确性较低;实际应用中建议优先使用内容检测,失败时回退扩展名,并对关键类型校验文件头魔数,如JPEG的0xFFD8FF;整体机制简单高效,需注意读取足够数据并做必要校验。

Go语言中判断文件的MIME类型,主要依赖于标准库 net/http 中的 DetectedContentType 函数,它通过读取文件的前512个字节进行类型推断,准确率较高,且无需依赖外部库。
使用 http.DetectContentType 判断MIME类型
该函数接收一个字节切片(通常是文件的前512字节),返回对应的MIME类型字符串。
示例代码:
func getMimeType(filePath string) string {
file, err := os.Open(filePath)
if err != nil {
return ""
}
defer file.Close()
// 读取前512字节
buffer := make([]byte, 512)
_, err = file.Read(buffer)
if err != nil {
return ""
}
// 检测MIME类型
contentType := http.DetectContentType(buffer)
return contentType
}
例如:
立即学习“go语言免费学习笔记(深入)”;
- 一个PNG图片文件会返回 image/png
- 一个PDF文件会返回 application/pdf
- 一个纯文本文件可能返回 text/plain; charset=utf-8
仅通过文件扩展名判断(辅助手段)
当无法读取文件内容时,可以退而求其次,使用文件扩展名进行推测。Go的 mime 包提供了扩展名到MIME类型的映射。
import "mime"
func getMimeTypeByExt(filename string) string {
ext := filepath.Ext(filename)
mimeType := mime.TypeByExtension(ext)
if mimeType == "" {
return "application/octet-stream" // 未知类型
}
return mimeType
}
注意:这种方法不如内容检测准确,比如一个被改后缀的恶意文件可能被误判。
实际使用建议
在实际项目中,推荐结合两种方式:
- 优先使用 http.DetectContentType 基于文件内容判断
- 内容无法读取时,回退到 mime.TypeByExtension
- 对关键类型(如图片、文档)做二次校验,比如检查文件头魔数(magic number)
比如检测是否为JPEG:
func isJPEG(data []byte) bool {
return len(data) > 2 &&
data[0] == 0xFF &&
data[1] == 0xD8 &&
data[2] == 0xFF
}
基本上就这些。Go的MIME检测机制简单高效,适合大多数场景,只要注意读取足够数据并做必要校验即可。不复杂但容易忽略细节。










