file.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package utils
  2. import (
  3. "fmt"
  4. "github.com/h2non/filetype"
  5. "github.com/h2non/filetype/types"
  6. "sync"
  7. )
  8. type SourceType string
  9. const (
  10. Image SourceType = "image"
  11. Video SourceType = "video"
  12. Archive SourceType = "archive"
  13. Audio SourceType = "audio"
  14. Document SourceType = "document"
  15. )
  16. func CheckFileType(buf []byte, sourceType SourceType, exactFileType []string, fileExt string) bool {
  17. switch sourceType {
  18. case Document:
  19. kind, err := filetype.Document(buf)
  20. if err != nil {
  21. return false
  22. }
  23. return exactFile(exactFileType, kind, fileExt)
  24. case Image:
  25. kind, err := filetype.Image(buf)
  26. if err != nil {
  27. return false
  28. }
  29. return exactFile(exactFileType, kind, fileExt)
  30. case Video:
  31. kind, err := filetype.Video(buf)
  32. if err != nil {
  33. return false
  34. }
  35. return exactFile(exactFileType, kind, fileExt)
  36. case Audio:
  37. kind, err := filetype.Audio(buf)
  38. if err != nil {
  39. return false
  40. }
  41. return exactFile(exactFileType, kind, fileExt)
  42. case Archive:
  43. kind, err := filetype.Archive(buf)
  44. if err != nil {
  45. return false
  46. }
  47. return exactFile(exactFileType, kind, fileExt)
  48. default:
  49. return false
  50. }
  51. }
  52. func exactFile(exactFileType []string, fileKind types.Type, fileExt string) bool {
  53. for _, fileType := range exactFileType {
  54. if fileKind.Extension == fileType {
  55. if fileExt != "" && (fileExt == fmt.Sprintf(".%s", fileKind.Extension) || (fileExt == ".jpeg" && fileKind.Extension == "jpg")) {
  56. return true
  57. }
  58. return false
  59. }
  60. }
  61. return false
  62. }
  63. func IsValidType(buf []byte, sourceTypes []SourceType, exactFileType []string, fileExt string) bool {
  64. if len(sourceTypes) == 0 {
  65. return false
  66. }
  67. var wg sync.WaitGroup
  68. resultChan := make(chan bool, len(sourceTypes))
  69. for _, sourceType := range sourceTypes {
  70. wg.Add(1)
  71. go func(st SourceType) {
  72. defer wg.Done()
  73. resultChan <- CheckFileType(buf, st, exactFileType, fileExt)
  74. }(sourceType)
  75. }
  76. wg.Wait()
  77. close(resultChan)
  78. for result := range resultChan {
  79. if result {
  80. return true
  81. }
  82. }
  83. return false
  84. }