Kaynağa Gözat

:art: 插入资源文件时文件名长度最大限制 189 字节 https://github.com/siyuan-note/siyuan/issues/7099

Liang Ding 2 yıl önce
ebeveyn
işleme
92ca6fd339
2 değiştirilmiş dosya ile 19 ekleme ve 3 silme
  1. 1 1
      kernel/model/assets.go
  2. 18 2
      kernel/util/file.go

+ 1 - 1
kernel/model/assets.go

@@ -176,8 +176,8 @@ func NetImg2LocalAssets(rootID string) (err error) {
 					}
 				}
 				name = strings.TrimSuffix(name, ext)
-				name = gulu.Str.SubStr(name, 63) // 插入资源文件时文件名长度最大限制 63 个字 https://github.com/siyuan-note/siyuan/issues/7099
 				name = util.FilterFileName(name)
+				name = util.TruncateLenFileName(name)
 				name = "net-img-" + name + "-" + ast.NewNodeID() + ext
 				writePath := filepath.Join(assetsDirPath, name)
 				if err = filelock.WriteFile(writePath, data); nil != err {

+ 18 - 2
kernel/util/file.go

@@ -17,12 +17,14 @@
 package util
 
 import (
+	"bytes"
 	"io"
 	"os"
 	"path"
 	"path/filepath"
 	"sort"
 	"strings"
+	"unicode/utf8"
 
 	"github.com/88250/gulu"
 	"github.com/88250/lute/ast"
@@ -141,11 +143,25 @@ func FilterUploadFileName(name string) string {
 	ret = strings.ReplaceAll(ret, "#", "")
 	ret = strings.ReplaceAll(ret, "%", "")
 	ret = strings.ReplaceAll(ret, "$", "")
-	// 插入资源文件时文件名长度最大限制 63 个字 https://github.com/siyuan-note/siyuan/issues/7099
-	ret = gulu.Str.SubStr(ret, 63)
+	ret = TruncateLenFileName(ret)
 	return ret
 }
 
+func TruncateLenFileName(name string) (ret string) {
+	// 插入资源文件时文件名长度最大限制 189 字节 https://github.com/siyuan-note/siyuan/issues/7099
+	var byteCount int
+	buf := bytes.Buffer{}
+	for _, r := range name {
+		byteCount += utf8.RuneLen(r)
+		if 189 < byteCount {
+			break
+		}
+		buf.WriteRune(r)
+	}
+	ret = buf.String()
+	return
+}
+
 func FilterFilePath(p string) (ret string) {
 	parts := strings.Split(p, "/")
 	var filteredParts []string