Cloudreve/pkg/filemanager/fs/mime/mime.go

41 lines
882 B
Go

package mime
import (
"context"
"encoding/json"
"github.com/cloudreve/Cloudreve/v4/pkg/logging"
"github.com/cloudreve/Cloudreve/v4/pkg/setting"
"mime"
"path"
)
type MimeDetector interface {
// TypeByName returns the mime type by file name.
TypeByName(ext string) string
}
type mimeDetector struct {
mapping map[string]string
}
func NewMimeDetector(ctx context.Context, settings setting.Provider, l logging.Logger) MimeDetector {
mappingStr := settings.MimeMapping(ctx)
mapping := make(map[string]string)
if err := json.Unmarshal([]byte(mappingStr), &mapping); err != nil {
l.Error("Failed to unmarshal mime mapping: %s, fallback to empty mapping", err)
}
return &mimeDetector{
mapping: mapping,
}
}
func (d *mimeDetector) TypeByName(p string) string {
ext := path.Ext(p)
if m, ok := d.mapping[ext]; ok {
return m
}
return mime.TypeByExtension(ext)
}