尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

h2non/filetype入门指南:如何用Go快速检测文件类型的终极教程

h2non/filetype入门指南:如何用Go快速检测文件类型的终极教程 h2non/filetype入门指南如何用Go快速检测文件类型的终极教程【免费下载链接】filetypeFast, dependency-free Go package to infer binary file types based on the magic numbers header signature项目地址: https://gitcode.com/gh_mirrors/fi/filetypefiletype 是一个快速、零依赖的 Go 包只需读取文件开头的魔数magic number签名就能准确推断出文件的真实类型并返回扩展名和标准 MIME 类型。它不依赖 C 库、不解析整个文件检测一次仅需约 1 微秒是 Go 开发者做文件类型识别、上传校验、内容审计的首选方案。为什么需要 filetype判断这个文件到底是什么最可靠的方法不是看扩展名用户随手改.jpg成.png很容易发生而是检查文件头部的魔数签名。filetype 正是围绕这一思路设计的特性说明⚡ 极快基准测试中每次检测约 1100~1300 纳秒大文件同样迅速 零依赖纯 Go 代码无需 C 编译跨平台运行 省流量只需前 262 字节的文件头即可判断流式读取也适用 结果完整同时给出扩展名如jpg和 MIME 类型如image/jpeg 可扩展一行 API 即可注册自定义文件类型匹配器安装 filetype一条命令搞定确保本机已安装 Go在项目中执行go get github.com/h2non/filetype如果习惯先克隆源码阅读仓库地址为https://gitcode.com/gh_mirrors/fi/filetype核心 API 非常简洁入口文件 filetype.go 和 match.go 中只有几十个函数十分钟就能读完。三步上手一行代码检测文件类型最核心的函数是Match把文件内容或文件头字节传进去即可buf, _ : os.ReadFile(sample.jpg) kind, _ : filetype.Match(buf) if kind filetype.Unknown { fmt.Println(未知文件类型) return } fmt.Printf(类型: %s, MIME: %s\n, kind.Extension, kind.MIME.Value) // 输出: 类型: jpg, MIME: image/jpeg不想读整个文件用MatchFile或MatchReader只读文件头就行内部只取前 8KB见 match.go 中的MatchReader实现kind, _ : filetype.MatchFile(movie.mp4)按大类快速判断图片、视频还是音频除了精确匹配filetype 还内置了按类别判断的快捷函数定义在 kind.go非常适合做上传入口的粗筛if filetype.IsImage(buf) { fmt.Println(这是一个图片文件) }同类函数还有IsVideo、IsAudio、IsArchive、IsDocument、IsFont、IsApplication以及filetype.Is(buf, jpg)、filetype.IsMIME(buf, image/png)等语义化判断。支持的文件类型清单一览覆盖 7 大类、60 种格式匹配器按类别拆分在 matchers/ 目录中图片jpg、png、gif、webp、bmp、tif、psd、ico、heif、avif 等视频mp4、mkv、webm、mov、avi、wmv、flv 等音频mp3、wav、ogg、flac、aac、m4a、mid 等压缩包zip、tar、rar、7z、gz、zst、iso、deb 等文档pdf、doc(x)、xls(x)、ppt(x)、rtf、epub 等字体ttf、otf、woff、woff2应用wasm、dex、parquet、exe 等类型注册表位于 types/types.go每个类型都由扩展名 MIME构成结构体定义在 types/type.go。扩展 filetype注册自定义文件类型内置类型不够用用NewTypeAddMatcher两步就能挂上自己的魔数规则var fooType filetype.NewType(foo, foo/foo) filetype.AddMatcher(fooType, func(buf []byte) bool { return len(buf) 1 buf[0] 0x01 buf[1] 0x02 })自定义匹配器会优先于内置匹配器执行注册机制见 matchers/matchers.go。性能有多快官方基准测试真实样本文件显示单次匹配耗时仅约 1 微秒BenchmarkMatchJpeg-8 1000000 1280 ns/op BenchmarkMatchPng-8 1000000 1121 ns/op BenchmarkMatchZip-8 1000000 1162 ns/op因为只比较文件头字节文件大小对性能几乎无影响百万级文件的批量扫描也毫无压力。项目结构导览代码库非常小巧建议按以下顺序阅读核心 APIfiletype.go类型判断、match.go匹配入口类别快捷函数kind.go类型系统types/types.go、types/mime.go各类匹配器matchers/image.go、matchers/video.go 等真实测试样本fixtures/ 目录含 jpg、png、avif、mp4、zip 等 20 个样本测试用例filetype_test.go、match_test.go常见问题Q检测结果为什么和我file命令的不一样filetype 基于魔数做快速匹配覆盖常见二进制格式而file是 C 实现的完整工具库规则更全但更重。两者定位不同filetype 胜在轻、快、纯 Go。Q返回Unknown怎么办说明该文件的头不匹配任何内置规则可检查文件是否被截断或参考上文注册自定义文件类型一节扩展匹配器。QSVG 支持吗SVG 是文本格式无魔数可查建议搭配项目作者的另一个小包 go-is-svg 使用。小结filetype 用最少的代码解决了 Go 项目里文件类型检测这个高频需求一行filetype.Match()就能识破文件的真实身份支持 60 种格式微秒级性能零第三方依赖。无论是做文件上传校验、网盘扫描还是内容安全审计都值得把它加进你的工具箱。【免费下载链接】filetypeFast, dependency-free Go package to infer binary file types based on the magic numbers header signature项目地址: https://gitcode.com/gh_mirrors/fi/filetype创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表