mirror of https://github.com/cloudreve/Cloudreve
41 lines
882 B
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)
|
|
}
|