12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package utils
- import (
- "fmt"
- "github.com/h2non/filetype"
- "github.com/h2non/filetype/types"
- "sync"
- )
- type SourceType string
- const (
- Image SourceType = "image"
- Video SourceType = "video"
- Archive SourceType = "archive"
- Audio SourceType = "audio"
- Document SourceType = "document"
- )
- func CheckFileType(buf []byte, sourceType SourceType, exactFileType []string, fileExt string) bool {
- switch sourceType {
- case Document:
- kind, err := filetype.Document(buf)
- if err != nil {
- return false
- }
- return exactFile(exactFileType, kind, fileExt)
- case Image:
- kind, err := filetype.Image(buf)
- if err != nil {
- return false
- }
- return exactFile(exactFileType, kind, fileExt)
- case Video:
- kind, err := filetype.Video(buf)
- if err != nil {
- return false
- }
- return exactFile(exactFileType, kind, fileExt)
- case Audio:
- kind, err := filetype.Audio(buf)
- if err != nil {
- return false
- }
- return exactFile(exactFileType, kind, fileExt)
- case Archive:
- kind, err := filetype.Archive(buf)
- if err != nil {
- return false
- }
- return exactFile(exactFileType, kind, fileExt)
- default:
- return false
- }
- }
- func exactFile(exactFileType []string, fileKind types.Type, fileExt string) bool {
- for _, fileType := range exactFileType {
- if fileKind.Extension == fileType {
- if fileExt != "" && (fileExt == fmt.Sprintf(".%s", fileKind.Extension) || (fileExt == ".jpeg" && fileKind.Extension == "jpg")) {
- return true
- }
- return false
- }
- }
- return false
- }
- func IsValidType(buf []byte, sourceTypes []SourceType, exactFileType []string, fileExt string) bool {
- if len(sourceTypes) == 0 {
- return false
- }
- var wg sync.WaitGroup
- resultChan := make(chan bool, len(sourceTypes))
- for _, sourceType := range sourceTypes {
- wg.Add(1)
- go func(st SourceType) {
- defer wg.Done()
- resultChan <- CheckFileType(buf, st, exactFileType, fileExt)
- }(sourceType)
- }
- wg.Wait()
- close(resultChan)
- for result := range resultChan {
- if result {
- return true
- }
- }
- return false
- }
|