1 Star 0 Fork 0

Cruvie Kang / kk_go_kit

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
kk_file.go 13.81 KB
一键复制 编辑 原始数据 按行查看 历史
cruvie 提交于 2024-03-09 21:22 . update
package kk_file
import (
"gitee.com/cruvie/kk_go_kit/kk_stage"
"log/slog"
"mime/multipart"
"net/http"
"os"
)
// DetectTypeByBytes 通过文件头判断图片类型
func DetectTypeByBytes(bytes []byte) string {
// 只需要前 512 个字节就可以了
buffer := bytes[:512]
/**
heic目前还没有标准 头匹配也不一定准确
https: //github.com/golang/go/issues/52144
文件类型标准汇总https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern
ipad
00000018667479706865696300000000686569636d696631000009866d657461000000000000002168646c72000000000000000070696374000000000000000000000000000000002464696e660000001c6472656600000000000000010000000c75726c20000000010000000e7069746d00000000001f000002d769696e6600000000002100000015696e66650200000100010000687663310000000015696e66650200000100020000687663310000000015696e66650200000100030000687663310000000015696e66650200000100040000687663310000000015696e66650200000100050000687663310000000015696e66650200000100060000687663310000000015696e66650200000100070000687663310000000015696e66650200000100080000687663310000000015696e66650200000100090000687663310000000015696e666502000001000a0000687663310000000015696e666502000001000b0000687663310000000015696e666502000001000c0000687663310000000015696e666502000001000d0000687663310000000015696e666502000001000e0000687663310000000015696e666502000001000f0000687663310000000015696e66650200000100100000687663310000000015696e66650200000100110000687663310000000015696e66650200000100120000687663310000
视频hevc
0000001466747970717420200000000071742020000000087769646500537a436d64617400d0000700f8172e149b1b0d060c7e0a9273460aa19445e18d2e55d8987de21e02f622038043c37edc21f0f7db447a9688963f424709c689f66de10db729238cd293e41c009e8f4e4f638826e9a4f2f89ca97ea46104d3215241049a582934c42711f59a080532c0f218c9aa1e93cd70a8d20fba324e2ede584ba4effbcfe5dc993c1663fa3be69884b80f3c533ecac15fa96d9217563b63ec975852ddcec158001e2fa1b2b0384080d044f44b6048d29b9e3a68c619c42b73e260d016eae11d911e529783fee80d8816cc0fcef43ce78ddf4756d924538eb2a071e0b64650db9036f38138c85df0757605c65bffbaa23bfab6f478b2a4ce5028b98729e0fb3fb954933cffe6907cb29f6cb010f6a4e57ff3d2287bbe4f07c0000034b91a96b65ab8fe0106172cb46bbc14c604760bbf5c6be2a37aaa2efbbcce23526329e2f617608ce7cc868a887fd7e0f413bbd38cf8bc76027a824ad3fbb3092b2e9359f38ef18f242bb97d575b8ff0fb0fb97595c53e270607f6e08e92612f1959c6a7734f7fc37c5ecf67255120f2fc7e1fbd7d4f8ba62c31c370eced78df9b6fbe3fd0fa8e938a4793c363f2bfb7e38dc04dec36da5a70cbfa8e88ec097018fcf5d96abad4d3f19e7546062273504aa4df98ca2ef7c7423e22717ce75d0c91
小米
000000186674797068656963000000006d6966316865696300000da86d657461000000000000002168646c720000000000000000706963740000000000000000000000000000000490696c6f63010000004400004827100000000000010000765e00001eb427110000000000010000951200001c4027120000000000010000b1520000281e27130000000000010000d970000027c227140000000000010001013200002b8a271500000000000100012cbc00002bfb2716000000000001000158b7000024c0271700000000000100017d770000202b271800000000000100019da20000186327190000000000010001b60500001fab271a0000000000010001d5b000002579271b0000000000010001fb2900002656271c0000000000010002217f00002969271d00000000000100024ae800001805271e000000000001000262ed00001cfe271f00000000000100027feb00001c49272000000000000100029c3400001cf027210000000000010002b92400001e0127220000000000010002d72500001a7b27230000000000010002f1a00000196e272400000000000100030b0e00001afc27250000000000010003260a00001bb12726000000000001000341bb00000bb9272700000000000100034d7400000a832728000000000001000357f700000f3a272900000000000100036731000014ed272a00000000000100037c
视频h265
00000018667479706d7034320000000069736f6d6d70343200000a3d667265650000006c6d76686400000000e036f4aae036f4aa00002710000070800001000001000000000000000000000000010000000000000000000000000000000100000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003000000ef6d6574610000002168646c7200000000000000006d64746100000000000000000000000000000000646b65797300000000000000030000001b6d647461636f6d2e616e64726f69642e76657273696f6e000000206d647461636f6d2e616e64726f69642e6d616e756661637475726572000000196d647461636f6d2e616e64726f69642e6d6f64656c00000062696c73740000001a000000010000001264617461000000010000000031330000001e00000002000000166461746100000001000000005869616f6d6900000022000000030000001a6461746100000001000000004d323130344b31304143000004df7472616b0000005c746b686400000007e036f4aae036f4aa000000010000000000006fac000000000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000400000000780000004380000000000306564747300000028656c7374000000000000000200000207ffffffff00
avif
0000001c667479706176696600000000617669666d6966316d6961660000098e6d657461000000000000002168646c72000000000000000070696374000000000000000000000000000000000e7069746d00000000000100000046696c6f63000000004440000300020000000009b2000100000000000003930001000000000d4500010000000000084b08000300000008584d000100000000000000a60000004d69696e6600000000000300000015696e66650200000000010000617630310000000015696e66650200000000020000617630310000000015696e6665020000010003000045786966000000089869707270000008726970636f000007d4636f6c7272494343000007c86170706c022000006d6e74725247422058595a2007d900020019000b001a000b616373704150504c000000006170706c000000000000000000000000000000000000f6d6000100000000d32d6170706c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b64657363000001080000006f6473636d000001780000058a637072740000070400000038777470740000073c000000147258595a00000750000000146758595a00000764000000146258595a0000077800000014725452430000078c0000000e636861640000079c0000002c625452430000078c0000
0000001c前缀表示控制字符,不是真正的文件头
*/
//match apple and 小米 heic
heicHeader := "ftypheic"
avifHeader := "ftypavif"
header := string(buffer[4:12]) //6674797061766966
var contentType string
if header == heicHeader {
contentType = Heic.ContentType
} else if header == avifHeader {
contentType = Avif.ContentType
} else {
contentType = http.DetectContentType(buffer)
}
return contentType
}
// DetectTypeByFile 通过文件头判断图片类型 支持os.File和multipart.FileHeader 二选一
func DetectTypeByFile[T *os.File | *multipart.FileHeader](stage *kk_stage.Stage, file T) string {
// 只需要前 512 个字节就可以了
buffer := make([]byte, 512)
var f any = file
switch f := f.(type) {
case *os.File:
osFile := f
if osFile != nil {
// 重置游标
_, err := osFile.Seek(0, 0)
if err != nil {
slog.Error("reset file cursor failed", kk_stage.NewLog(stage).Error(err).Args()...)
}
//读取文件头
_, err = osFile.Read(buffer)
if err != nil {
slog.Error("read file header failed", kk_stage.NewLog(stage).Error(err).Args()...)
return ""
}
}
case *multipart.FileHeader:
mFile := f
if mFile != nil {
file, err := (*mFile).Open()
if err != nil {
slog.Error("open file failed", kk_stage.NewLog(stage).Error(err).Args()...)
return ""
}
_, err = file.Read(buffer)
if err != nil {
slog.Error("read file header failed", kk_stage.NewLog(stage).Error(err).Args()...)
return ""
}
// 重置游标
_, err = file.Seek(0, 0)
if err != nil {
slog.Error("reset file cursor failed", kk_stage.NewLog(stage).Error(err).Args()...)
return ""
}
}
}
return DetectTypeByBytes(buffer)
}
//func DetectTypeByBytes(osFile *os.File, mFile *multipart.FileHeader) string {
// // 只需要前 512 个字节就可以了
// buffer := make([]byte, 512)
// if osFile != nil {
// // 重置游标
// _, _ = osFile.Seek(0, 0)
// //读取文件头
// _, err := osFile.Read(buffer)
// if err != nil {
// slog.Info("读取文件头失败:", err)
// return ""
// }
// } else {
// //读取文件头
// file, err := (*mFile).Open()
// if err != nil {
// slog.Info("打开文件失败:", err)
// return ""
// }
// _, err = file.Read(buffer)
// if err != nil {
// slog.Info("读取文件头失败:", err)
// return ""
// }
// // 重置游标
// _, _ = file.Seek(0, 0)
// }
//
// /**
// heic目前还没有标准 头匹配也不一定准确
// https: //github.com/golang/go/issues/52144
// 文件类型标准汇总https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern
// ipad
// 00000018667479706865696300000000686569636d696631000009866d657461000000000000002168646c72000000000000000070696374000000000000000000000000000000002464696e660000001c6472656600000000000000010000000c75726c20000000010000000e7069746d00000000001f000002d769696e6600000000002100000015696e66650200000100010000687663310000000015696e66650200000100020000687663310000000015696e66650200000100030000687663310000000015696e66650200000100040000687663310000000015696e66650200000100050000687663310000000015696e66650200000100060000687663310000000015696e66650200000100070000687663310000000015696e66650200000100080000687663310000000015696e66650200000100090000687663310000000015696e666502000001000a0000687663310000000015696e666502000001000b0000687663310000000015696e666502000001000c0000687663310000000015696e666502000001000d0000687663310000000015696e666502000001000e0000687663310000000015696e666502000001000f0000687663310000000015696e66650200000100100000687663310000000015696e66650200000100110000687663310000000015696e66650200000100120000687663310000
// 视频hevc
// 0000001466747970717420200000000071742020000000087769646500537a436d64617400d0000700f8172e149b1b0d060c7e0a9273460aa19445e18d2e55d8987de21e02f622038043c37edc21f0f7db447a9688963f424709c689f66de10db729238cd293e41c009e8f4e4f638826e9a4f2f89ca97ea46104d3215241049a582934c42711f59a080532c0f218c9aa1e93cd70a8d20fba324e2ede584ba4effbcfe5dc993c1663fa3be69884b80f3c533ecac15fa96d9217563b63ec975852ddcec158001e2fa1b2b0384080d044f44b6048d29b9e3a68c619c42b73e260d016eae11d911e529783fee80d8816cc0fcef43ce78ddf4756d924538eb2a071e0b64650db9036f38138c85df0757605c65bffbaa23bfab6f478b2a4ce5028b98729e0fb3fb954933cffe6907cb29f6cb010f6a4e57ff3d2287bbe4f07c0000034b91a96b65ab8fe0106172cb46bbc14c604760bbf5c6be2a37aaa2efbbcce23526329e2f617608ce7cc868a887fd7e0f413bbd38cf8bc76027a824ad3fbb3092b2e9359f38ef18f242bb97d575b8ff0fb0fb97595c53e270607f6e08e92612f1959c6a7734f7fc37c5ecf67255120f2fc7e1fbd7d4f8ba62c31c370eced78df9b6fbe3fd0fa8e938a4793c363f2bfb7e38dc04dec36da5a70cbfa8e88ec097018fcf5d96abad4d3f19e7546062273504aa4df98ca2ef7c7423e22717ce75d0c91
//
// 小米
// 000000186674797068656963000000006d6966316865696300000da86d657461000000000000002168646c720000000000000000706963740000000000000000000000000000000490696c6f63010000004400004827100000000000010000765e00001eb427110000000000010000951200001c4027120000000000010000b1520000281e27130000000000010000d970000027c227140000000000010001013200002b8a271500000000000100012cbc00002bfb2716000000000001000158b7000024c0271700000000000100017d770000202b271800000000000100019da20000186327190000000000010001b60500001fab271a0000000000010001d5b000002579271b0000000000010001fb2900002656271c0000000000010002217f00002969271d00000000000100024ae800001805271e000000000001000262ed00001cfe271f00000000000100027feb00001c49272000000000000100029c3400001cf027210000000000010002b92400001e0127220000000000010002d72500001a7b27230000000000010002f1a00000196e272400000000000100030b0e00001afc27250000000000010003260a00001bb12726000000000001000341bb00000bb9272700000000000100034d7400000a832728000000000001000357f700000f3a272900000000000100036731000014ed272a00000000000100037c
// 视频h265
// 00000018667479706d7034320000000069736f6d6d70343200000a3d667265650000006c6d76686400000000e036f4aae036f4aa00002710000070800001000001000000000000000000000000010000000000000000000000000000000100000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003000000ef6d6574610000002168646c7200000000000000006d64746100000000000000000000000000000000646b65797300000000000000030000001b6d647461636f6d2e616e64726f69642e76657273696f6e000000206d647461636f6d2e616e64726f69642e6d616e756661637475726572000000196d647461636f6d2e616e64726f69642e6d6f64656c00000062696c73740000001a000000010000001264617461000000010000000031330000001e00000002000000166461746100000001000000005869616f6d6900000022000000030000001a6461746100000001000000004d323130344b31304143000004df7472616b0000005c746b686400000007e036f4aae036f4aa000000010000000000006fac000000000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000400000000780000004380000000000306564747300000028656c7374000000000000000200000207ffffffff00
//
// avif
// 0000001c667479706176696600000000617669666d6966316d6961660000098e6d657461000000000000002168646c72000000000000000070696374000000000000000000000000000000000e7069746d00000000000100000046696c6f63000000004440000300020000000009b2000100000000000003930001000000000d4500010000000000084b08000300000008584d000100000000000000a60000004d69696e6600000000000300000015696e66650200000000010000617630310000000015696e66650200000000020000617630310000000015696e6665020000010003000045786966000000089869707270000008726970636f000007d4636f6c7272494343000007c86170706c022000006d6e74725247422058595a2007d900020019000b001a000b616373704150504c000000006170706c000000000000000000000000000000000000f6d6000100000000d32d6170706c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b64657363000001080000006f6473636d000001780000058a637072740000070400000038777470740000073c000000147258595a00000750000000146758595a00000764000000146258595a0000077800000014725452430000078c0000000e636861640000079c0000002c625452430000078c0000
// 0000001c前缀表示控制字符,不是真正的文件头
// */
// //match apple and 小米 heic
// heicHeader := "ftypheic"
// avifHeader := "ftypavif"
// header := string(buffer[4:12]) //6674797061766966
//
// var contentType string
// if header == heicHeader {
// contentType = kk_file.ImageTypeHEIC
// } else if header == avifHeader {
// contentType = kk_file.ImageTypeAVIF
// } else {
// contentType = http.DetectContentType(buffer)
// }
// return contentType
//}
// ConvertFileSizeMB 转换文件大小B->MB
func ConvertFileSizeMB(size int64) float64 {
return float64(size) / 1024 / 1024
}
1
https://gitee.com/cruvie/kk_go_kit.git
git@gitee.com:cruvie/kk_go_kit.git
cruvie
kk_go_kit
kk_go_kit
8ab331d8547b

搜索帮助