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