11package fs
22
33import (
4+ "errors"
45 "path/filepath"
56 "strings"
67
@@ -13,14 +14,16 @@ const (
1314 MimeTypeUnknown = ""
1415)
1516
16- // MimeType returns the mimetype of a file, or an empty string if it could not be determined.
17+ // DetectMimeType returns the MIME type of the specified file,
18+ // or an error if the type could not be detected.
1719//
1820// The IANA and IETF use the term "media type", and consider the term "MIME type" to be obsolete,
1921// since media types have become used in contexts unrelated to email, such as HTTP:
2022// https://en.wikipedia.org/wiki/Media_type#Structure
21- func MimeType (filename string ) (mimeType string ) {
23+ func DetectMimeType (filename string ) (mimeType string , err error ) {
24+ // Abort if no filename was specified.
2225 if filename == "" {
23- return MimeTypeUnknown
26+ return MimeTypeUnknown , errors . New ( "missing filename" )
2427 }
2528
2629 // Detect file type based on the filename extension.
@@ -31,44 +34,51 @@ func MimeType(filename string) (mimeType string) {
3134 switch fileType {
3235 // MPEG-2 Transport Stream
3336 case VideoM2TS , VideoAVCHD :
34- return header .ContentTypeM2TS
37+ return header .ContentTypeM2TS , nil
3538 // Apple QuickTime Container
3639 case VideoMov :
37- return header .ContentTypeMov
40+ return header .ContentTypeMov , nil
3841 // MPEG-4 AVC Video
3942 case VideoAvc :
40- return header .ContentTypeMp4Avc
43+ return header .ContentTypeMp4Avc , nil
4144 // MPEG-4 HEVC Video
4245 case VideoHvc :
43- return header .ContentTypeMp4Hvc
46+ return header .ContentTypeMp4Hvc , nil
4447 // MPEG-4 HEVC Bitstream
4548 case VideoHev :
46- return header .ContentTypeMp4Hev
49+ return header .ContentTypeMp4Hev , nil
4750 // Adobe Digital Negative
4851 case ImageDng :
49- return header .ContentTypeDng
52+ return header .ContentTypeDng , nil
5053 // Adobe Illustrator
5154 case VectorAI :
52- return header .ContentTypeAI
55+ return header .ContentTypeAI , nil
5356 // Adobe PostScript
5457 case VectorPS :
55- return header .ContentTypePS
58+ return header .ContentTypePS , nil
5659 // Adobe Embedded PostScript
5760 case VectorEPS :
58- return header .ContentTypeEPS
61+ return header .ContentTypeEPS , nil
5962 // Adobe PDF
6063 case DocumentPDF :
61- return header .ContentTypePDF
64+ return header .ContentTypePDF , nil
6265 // Scalable Vector Graphics
6366 case VectorSVG :
64- return header .ContentTypeSVG
67+ return header .ContentTypeSVG , nil
6568 }
6669
67- // Detect mime type based on the file content .
70+ // Use "gabriel-vasile/mimetype" to automatically detect the MIME type .
6871 detectedType , err := mimetype .DetectFile (filename )
6972
70- if detectedType != nil && err == nil {
71- mimeType = detectedType .String ()
73+ // Check if type could be successfully detected.
74+ if err == nil {
75+ if detectedType != nil {
76+ mimeType = detectedType .String ()
77+ }
78+ } else if e := err .Error (); strings .HasSuffix (e , ErrPermissionDenied .Error ()) {
79+ return MimeTypeUnknown , ErrPermissionDenied
80+ } else if strings .Contains (e , EOF .Error ()) {
81+ return MimeTypeUnknown , ErrUnexpectedEOF
7282 }
7383
7484 // Treat "application/octet-stream" as unknown.
@@ -81,25 +91,32 @@ func MimeType(filename string) (mimeType string) {
8191 switch fileType {
8292 // MPEG-4 Multimedia Container
8393 case VideoMp4 :
84- return header .ContentTypeMp4
94+ return header .ContentTypeMp4 , nil
8595 // AV1 Image File
8696 case ImageAvif :
87- return header .ContentTypeAvif
97+ return header .ContentTypeAvif , nil
8898 // AV1 Image File Sequence
8999 case ImageAvifS :
90- return header .ContentTypeAvifS
100+ return header .ContentTypeAvifS , nil
91101 // High Efficiency Image Container
92102 case ImageHeic , ImageHeif :
93- return header .ContentTypeHeic
103+ return header .ContentTypeHeic , nil
94104 // High Efficiency Image Container Sequence
95105 case ImageHeicS :
96- return header .ContentTypeHeicS
106+ return header .ContentTypeHeicS , nil
97107 // ZIP Archive File:
98108 case ArchiveZip :
99- return header .ContentTypeZip
109+ return header .ContentTypeZip , nil
100110 }
101111 }
102112
113+ return mimeType , err
114+ }
115+
116+ // MimeType returns the MIME type of the specified file,
117+ // or an empty string if the type could not be detected.
118+ func MimeType (filename string ) (mimeType string ) {
119+ mimeType , _ = DetectMimeType (filename )
103120 return mimeType
104121}
105122
0 commit comments