diff --git a/fileupload/fileupload.go b/fileupload/fileupload.go index 5c72608..0bd913b 100644 --- a/fileupload/fileupload.go +++ b/fileupload/fileupload.go @@ -39,6 +39,23 @@ var inlineMIMETypes = map[string]bool{ "video/webm": true, } +// Some MIME types have multiple possible extensions, and +// mime.ExtensionsByType returns them out-of-order. We have to hardcode +// a few MIME types to work around this unfortunately (e.g. to not use +// ".jfif" for "image/jpeg"). +// +// Note, this is not for registering new MIME types (use mime.AddExtensionType +// for that purpose). +var primaryExts = map[string]string{ + "audio/aac": "aac", + "audio/mp4": "mp4", + "audio/mpeg": "mp3", + "audio/ogg": "oga", + "image/jpeg": "jpeg", + "text/plain": "txt", + "video/mp4": "mp4", +} + type Uploader interface { load(filename string) (basename string, modTime time.Time, content io.ReadSeekCloser, err error) store(r io.Reader, username, mimeType, basename string) (outFilename string, err error) diff --git a/fileupload/fs.go b/fileupload/fs.go index 9e229d1..d0bff2b 100644 --- a/fileupload/fs.go +++ b/fileupload/fs.go @@ -44,8 +44,9 @@ func (fs *fs) store(r io.Reader, username, mimeType, origBasename string) (outFi var suffix string if filepath.Ext(origBasename) == "" && mimeType != "" { - exts, _ := mime.ExtensionsByType(mimeType) - if len(exts) > 0 { + if ext, ok := primaryExts[mimeType]; ok { + suffix = "." + ext + } else if exts, _ := mime.ExtensionsByType(mimeType); len(exts) == 1 { suffix = exts[0] } }