switched from h2non/filetype to garbiel-vasile/mimetype for determining file type
This commit is contained in:
parent
fca36e9b02
commit
2081998ca9
4 changed files with 24 additions and 21 deletions
2
go.mod
2
go.mod
|
@ -17,6 +17,7 @@ require (
|
|||
|
||||
require (
|
||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
|
||||
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||
|
@ -29,6 +30,7 @@ require (
|
|||
github.com/spf13/pflag v1.0.6 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/net v0.39.0 // indirect
|
||||
golang.org/x/sync v0.14.0 // indirect
|
||||
golang.org/x/sys v0.33.0 // indirect
|
||||
golang.org/x/text v0.25.0 // indirect
|
||||
|
|
4
go.sum
4
go.sum
|
@ -9,6 +9,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
|
|||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
|
||||
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
|
||||
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
|
||||
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
|
@ -66,6 +68,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
|||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
|
||||
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
|
||||
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
|
||||
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
|
||||
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
|
||||
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||
|
|
|
@ -46,6 +46,7 @@ func setDefaults() {
|
|||
viper.SetDefault("db.debug", false)
|
||||
// Others
|
||||
viper.SetDefault("processing.oleurl", "http://localhost:5000")
|
||||
viper.SetDefault("processing.maxmimesize", "0")
|
||||
viper.SetDefault("store.path", "./storage/files/")
|
||||
viper.SetDefault("debug", false)
|
||||
// UI Interface info
|
||||
|
|
|
@ -1,41 +1,37 @@
|
|||
package store
|
||||
|
||||
import (
|
||||
"github.com/h2non/filetype"
|
||||
"log/slog"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/gabriel-vasile/mimetype"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
// Returns the MIME type of a file
|
||||
func GetFileType(fileId string) (string, error) {
|
||||
start := time.Now()
|
||||
path, err := AbsPath(fileId)
|
||||
if err != nil {
|
||||
return "application/octet-stream", nil
|
||||
}
|
||||
file, err := os.Open(path)
|
||||
mimetype.SetLimit(uint32(viper.GetSizeInBytes("processing.maxmimesize")))
|
||||
mtype, err := mimetype.DetectFile(path)
|
||||
if err != nil {
|
||||
slog.Error("Storage not accessible", "error", err, "fileid", fileId)
|
||||
slog.Error("Storage not accessible", "error", err, "file-uuid", fileId, "mimetype", mtype.String())
|
||||
return "application/octet-stream", err
|
||||
}
|
||||
|
||||
// We only have to pass the file header = first 261 bytes
|
||||
head := make([]byte, 261)
|
||||
file.Read(head)
|
||||
return GetBytesFileType(head)
|
||||
slog.Debug("store.GetFileType", "file-uuid", fileId, "mimetype", mtype.String(), "extension", mtype.Extension(), "duration", time.Now().Sub(start).String())
|
||||
return mtype.String(), nil
|
||||
}
|
||||
|
||||
// Returns the MimeType for a []byte
|
||||
// We only have to pass the file header = first 261 bytes
|
||||
func GetBytesFileType(data []byte) (string, error) {
|
||||
kind, err := filetype.Match(data)
|
||||
slog.Debug("GetBytesFileType", "data", data, "file-mime", kind.MIME.Value)
|
||||
if err != nil {
|
||||
slog.Error("Could not determine file type", "error", err)
|
||||
return "application/octet-stream", err
|
||||
}
|
||||
if kind == filetype.Unknown {
|
||||
return "application/octet-stream", nil
|
||||
}
|
||||
// Only pass the necessary data!
|
||||
func GetBytesFileType(data []byte) (string) {
|
||||
mimetype.SetLimit(uint32(viper.GetSizeInBytes("processing.maxmimesize")))
|
||||
mtype := mimetype.Detect(data)
|
||||
slog.Debug("GetBytesFileType", "data", data, "file-mime", mtype.String())
|
||||
|
||||
return kind.MIME.Value, nil
|
||||
|
||||
return mtype.String()
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue