Browse Source

:bug: 复制资源文件后导出再导入后丢失 Fix https://github.com/siyuan-note/siyuan/issues/5320

Liang Ding 3 years ago
parent
commit
a0a3d2f28e
3 changed files with 34 additions and 25 deletions
  1. 15 12
      kernel/model/import.go
  2. 1 13
      kernel/model/upload.go
  3. 18 0
      kernel/util/file.go

+ 15 - 12
kernel/model/import.go

@@ -394,6 +394,7 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
 		})
 
 		targetPaths := map[string]string{}
+		assetsDone := map[string]string{}
 
 		// md 转换 sy
 		i := 0
@@ -481,15 +482,19 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
 				}
 				fullPath, exist = assets[absDest]
 				if exist {
-					name := filepath.Base(fullPath)
-					ext := filepath.Ext(name)
-					name = strings.TrimSuffix(name, ext)
-					name += "-" + ast.NewNodeID() + ext
-					assetTargetPath := filepath.Join(assetDirPath, name)
-					delete(assets, absDest)
-					if err = gulu.File.Copy(fullPath, assetTargetPath); nil != err {
-						util.LogErrorf("copy asset from [%s] to [%s] failed: %s", fullPath, assetTargetPath, err)
-						return ast.WalkContinue
+					existName := assetsDone[absDest]
+					var name string
+					if "" == existName {
+						name = filepath.Base(fullPath)
+						name = util.AssetName(name)
+						assetTargetPath := filepath.Join(assetDirPath, name)
+						if err = gulu.File.Copy(fullPath, assetTargetPath); nil != err {
+							util.LogErrorf("copy asset from [%s] to [%s] failed: %s", fullPath, assetTargetPath, err)
+							return ast.WalkContinue
+						}
+						assetsDone[absDest] = name
+					} else {
+						name = existName
 					}
 					n.Tokens = gulu.Str.ToBytes("assets/" + name)
 				}
@@ -568,9 +573,7 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
 			}
 			if exist {
 				name := filepath.Base(absolutePath)
-				ext := filepath.Ext(name)
-				name = strings.TrimSuffix(name, ext)
-				name += "-" + ast.NewNodeID() + ext
+				name = util.AssetName(name)
 				assetTargetPath := filepath.Join(assetDirPath, name)
 				if err = gulu.File.CopyFile(absolutePath, assetTargetPath); nil != err {
 					util.LogErrorf("copy asset from [%s] to [%s] failed: %s", absolutePath, assetTargetPath, err)

+ 1 - 13
kernel/model/upload.go

@@ -159,19 +159,7 @@ func Upload(c *gin.Context) {
 			// 已经存在同样数据的资源文件的话不重复保存
 			succMap[baseName] = existAsset.Path
 		} else {
-			_, id := util.LastID(fName)
-			ext := path.Ext(fName)
-			fName = fName[0 : len(fName)-len(ext)]
-			if !util.IsIDPattern(id) {
-				id = ast.NewNodeID()
-				fName = fName + "-" + id + ext
-			} else {
-				if !util.IsIDPattern(fName) {
-					fName = fName[:len(fName)-len(id)-1] + "-" + id + ext
-				} else {
-					fName = fName + ext
-				}
-			}
+			fName = util.AssetName(fName)
 			writePath := filepath.Join(assetsDirPath, fName)
 			if _, err = f.Seek(0, io.SeekStart); nil != err {
 				errFiles = append(errFiles, fName)

+ 18 - 0
kernel/util/file.go

@@ -24,6 +24,7 @@ import (
 	"strings"
 
 	"github.com/88250/gulu"
+	"github.com/88250/lute/ast"
 )
 
 func IsEmptyDir(p string) bool {
@@ -47,6 +48,23 @@ func RemoveID(name string) string {
 	return name + ext
 }
 
+func AssetName(name string) string {
+	_, id := LastID(name)
+	ext := path.Ext(name)
+	name = name[0 : len(name)-len(ext)]
+	if !IsIDPattern(id) {
+		id = ast.NewNodeID()
+		name = name + "-" + id + ext
+	} else {
+		if !IsIDPattern(name) {
+			name = name[:len(name)-len(id)-1] + "-" + id + ext
+		} else {
+			name = name + ext
+		}
+	}
+	return name
+}
+
 func LastID(p string) (name, id string) {
 	name = path.Base(p)
 	ext := path.Ext(name)