From 22843ffc70e871963df7efa45248e6b3e39c90ad Mon Sep 17 00:00:00 2001 From: NewbieOrange Date: Mon, 13 Feb 2023 14:41:35 +0800 Subject: [PATCH] fix(fs): copy file if symlink failed (#3368) --- internal/fs/util.go | 2 +- pkg/utils/file.go | 30 +++++++++++++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/internal/fs/util.go b/internal/fs/util.go index 795a1888..6ff9f7b3 100644 --- a/internal/fs/util.go +++ b/internal/fs/util.go @@ -43,7 +43,7 @@ func getFileStreamFromLink(file model.Obj, link *model.Link) (*model.FileStream, } else if link.FilePath != nil { // create a new temp symbolic link, because it will be deleted after upload newFilePath := stdpath.Join(conf.Conf.TempDir, fmt.Sprintf("%s-%s", uuid.NewString(), file.GetName())) - err := os.Symlink(*link.FilePath, newFilePath) + err := utils.SymlinkOrCopyFile(*link.FilePath, newFilePath) if err != nil { return nil, err } diff --git a/pkg/utils/file.go b/pkg/utils/file.go index a0cf619a..2a4fc6ed 100644 --- a/pkg/utils/file.go +++ b/pkg/utils/file.go @@ -40,7 +40,7 @@ func CopyFile(src, dst string) error { } // CopyDir Dir copies a whole directory recursively -func CopyDir(src string, dst string) error { +func CopyDir(src, dst string) error { var err error var fds []os.DirEntry var srcinfo os.FileInfo @@ -71,6 +71,17 @@ func CopyDir(src string, dst string) error { return nil } +// SymlinkOrCopyFile symlinks a file or copy if symlink failed +func SymlinkOrCopyFile(src, dst string) error { + if err := CreateNestedDirectory(filepath.Dir(dst)); err != nil { + return err + } + if err := os.Symlink(src, dst); err != nil { + return CopyFile(src, dst) + } + return nil +} + // Exists determine whether the file exists func Exists(name string) bool { if _, err := os.Stat(name); err != nil { @@ -81,15 +92,20 @@ func Exists(name string) bool { return true } +// CreateNestedDirectory create nested directory +func CreateNestedDirectory(path string) error { + err := os.MkdirAll(path, 0700) + if err != nil { + log.Errorf("can't create folder, %s", err) + } + return err +} + // CreateNestedFile create nested file func CreateNestedFile(path string) (*os.File, error) { basePath := filepath.Dir(path) - if !Exists(basePath) { - err := os.MkdirAll(basePath, 0700) - if err != nil { - log.Errorf("can't create folder, %s", err) - return nil, err - } + if err := CreateNestedDirectory(basePath); err != nil { + return nil, err } return os.Create(path) }