Improve file content types detections

Read files and detect their types only if the identification through the extension has failed
This commit is contained in:
Julien Loir 2020-12-03 12:45:37 +01:00
parent 9515ceeb42
commit f0d7704e98

View File

@ -139,6 +139,12 @@ func (i *FileInfo) detectType(modify, saveContent bool) error {
// imagine the situation where a file in a dir with thousands // imagine the situation where a file in a dir with thousands
// of files couldn't be opened: we'd have immediately // of files couldn't be opened: we'd have immediately
// a 500 even though it doesn't matter. So we just log it. // a 500 even though it doesn't matter. So we just log it.
readLen := 0
buffer := make([]byte, 0)
mimetype := mime.TypeByExtension(i.Extension)
if mimetype == "" {
reader, err := i.Fs.Open(i.Path) reader, err := i.Fs.Open(i.Path)
if err != nil { if err != nil {
log.Print(err) log.Print(err)
@ -147,7 +153,7 @@ func (i *FileInfo) detectType(modify, saveContent bool) error {
} }
defer reader.Close() defer reader.Close()
buffer := make([]byte, 512) buffer = make([]byte, 512)
n, err := reader.Read(buffer) n, err := reader.Read(buffer)
if err != nil && err != io.EOF { if err != nil && err != io.EOF {
log.Print(err) log.Print(err)
@ -155,8 +161,7 @@ func (i *FileInfo) detectType(modify, saveContent bool) error {
return nil return nil
} }
mimetype := mime.TypeByExtension(i.Extension) readLen = n
if mimetype == "" {
mimetype = http.DetectContentType(buffer[:n]) mimetype = http.DetectContentType(buffer[:n])
} }
@ -171,7 +176,7 @@ func (i *FileInfo) detectType(modify, saveContent bool) error {
case strings.HasPrefix(mimetype, "image"): case strings.HasPrefix(mimetype, "image"):
i.Type = "image" i.Type = "image"
return nil return nil
case isBinary(buffer[:n], n) || i.Size > 10*1024*1024: // 10 MB case readLen > 0 && (isBinary(buffer[:readLen], readLen) || i.Size > 10*1024*1024): // 10 MB
i.Type = "blob" i.Type = "blob"
return nil return nil
default: default: