Extract file reading into a dedicated function

This commit is contained in:
Julien Loir 2020-12-03 18:56:11 +01:00
parent 3b74029907
commit e432723e20
2 changed files with 25 additions and 22 deletions

View File

@ -144,29 +144,12 @@ func (i *FileInfo) detectType(modify, saveContent bool) error {
// 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 var buffer []byte
buffer := make([]byte, 0)
mimetype := mime.TypeByExtension(i.Extension) mimetype := mime.TypeByExtension(i.Extension)
if mimetype == "" { if mimetype == "" {
reader, err := i.Fs.Open(i.Path) buffer = i.readFirstBytes()
if err != nil { mimetype = http.DetectContentType(buffer)
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])
} }
switch { switch {
@ -180,7 +163,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 readLen > 0 && (isBinary(buffer[:readLen], readLen) || i.Size > 10*1024*1024): // 10 MB case (len(buffer) > 0 && isBinary(buffer)) || i.Size > 10*1024*1024: // 10 MB
i.Type = "blob" i.Type = "blob"
return nil return nil
default: default:
@ -204,6 +187,26 @@ func (i *FileInfo) detectType(modify, saveContent bool) error {
return nil return nil
} }
func (i *FileInfo) readFirstBytes() []byte {
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
}
return buffer[:n]
}
func (i *FileInfo) detectSubtitles() { func (i *FileInfo) detectSubtitles() {
if i.Type != "video" { if i.Type != "video" {
return return

View File

@ -5,7 +5,7 @@ import (
"unicode/utf8" "unicode/utf8"
) )
func isBinary(content []byte, _ int) bool { func isBinary(content []byte) bool {
maybeStr := string(content) maybeStr := string(content)
runeCnt := utf8.RuneCount(content) runeCnt := utf8.RuneCount(content)
runeIndex := 0 runeIndex := 0