diff --git a/kernel/api/file.go b/kernel/api/file.go index d638d08ce..a842eb711 100644 --- a/kernel/api/file.go +++ b/kernel/api/file.go @@ -17,6 +17,7 @@ package api import ( + "fmt" "io" "mime" "mime/multipart" @@ -35,6 +36,44 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func globalCopyFiles(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + var srcs []string + srcsArg := arg["srcs"].([]interface{}) + for _, s := range srcsArg { + srcs = append(srcs, s.(string)) + } + + for _, src := range srcs { + if !filelock.IsExist(src) { + msg := fmt.Sprintf("file [%s] does not exist", src) + logging.LogErrorf(msg) + ret.Code = -1 + ret.Msg = msg + return + } + } + + destDir := arg["destDir"].(string) // 相对于工作空间的路径 + destDir = filepath.Join(util.WorkspaceDir, destDir) + for _, src := range srcs { + dest := filepath.Join(destDir, filepath.Base(src)) + if err := filelock.Copy(src, dest); nil != err { + logging.LogErrorf("copy file [%s] to [%s] failed: %s", src, dest, err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + } +} + func copyFile(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index f59849480..6af5564d5 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -202,6 +202,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/file/getFile", model.CheckAuth, getFile) ginServer.Handle("POST", "/api/file/putFile", model.CheckAuth, model.CheckReadonly, putFile) ginServer.Handle("POST", "/api/file/copyFile", model.CheckAuth, model.CheckReadonly, copyFile) + ginServer.Handle("POST", "/api/file/globalCopyFiles", model.CheckAuth, model.CheckReadonly, globalCopyFiles) ginServer.Handle("POST", "/api/file/removeFile", model.CheckAuth, model.CheckReadonly, removeFile) ginServer.Handle("POST", "/api/file/renameFile", model.CheckAuth, model.CheckReadonly, renameFile) ginServer.Handle("POST", "/api/file/readDir", model.CheckAuth, readDir)