diff --git a/kernel/mobile/kernel.go b/kernel/mobile/kernel.go index 6278a0b22..900238fcf 100644 --- a/kernel/mobile/kernel.go +++ b/kernel/mobile/kernel.go @@ -98,6 +98,10 @@ func GetAssetAbsPath(asset string) (ret string) { return } +func GetMimeTypeByExt(ext string) string { + return util.GetMimeTypeByExt(ext) +} + func SetTimezone(container, appDir, timezoneID string) { if "ios" == container { os.Setenv("ZONEINFO", filepath.Join(appDir, "app", "zoneinfo.zip")) diff --git a/kernel/model/repository.go b/kernel/model/repository.go index f2d646214..aa8f3ec75 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -153,7 +153,7 @@ func OpenRepoSnapshotDoc(fileID string) (title, content string, displayInText bo displayInText = true title = path.Base(file.Path) - if mimeType := mime.TypeByExtension(filepath.Ext(file.Path)); strings.HasPrefix(mimeType, "text/") { + if mimeType := mime.TypeByExtension(filepath.Ext(file.Path)); strings.HasPrefix(mimeType, "text/") || strings.Contains(mimeType, "json") { // 如果是文本文件,直接返回文本内容 // All plain text formats are supported when comparing data snapshots https://github.com/siyuan-note/siyuan/issues/12975 content = gulu.Str.FromBytes(data) diff --git a/kernel/util/file.go b/kernel/util/file.go index 560c62d90..3aab9852d 100644 --- a/kernel/util/file.go +++ b/kernel/util/file.go @@ -20,6 +20,7 @@ import ( "bytes" "io" "io/fs" + "mime" "os" "path" "path/filepath" @@ -29,6 +30,7 @@ import ( "github.com/88250/gulu" "github.com/88250/lute/ast" + "github.com/gabriel-vasile/mimetype" "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" ) @@ -73,6 +75,21 @@ func GetUniqueFilename(filePath string) string { } } +func GetMimeTypeByExt(filePath string) (ret string) { + ret = mime.TypeByExtension(filepath.Ext(filePath)) + if "" == ret { + m, err := mimetype.DetectFile(filePath) + if err != nil { + logging.LogErrorf("detect mime type of [%s] failed: %s", filePath, err) + return + } + if nil != m { + ret = m.String() + } + } + return +} + func IsSymlinkPath(absPath string) bool { fi, err := os.Lstat(absPath) if err != nil {