diff --git a/files/file.go b/files/file.go index 5abf0792..c2566e6a 100644 --- a/files/file.go +++ b/files/file.go @@ -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: