diff --git a/assets b/assets index 09480ff..3a23464 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 09480ffa21d859a1d2f9bb2421e6f78f113494c4 +Subproject commit 3a23464a0f4330e4583e99c1815b84c5240ffc9d diff --git a/pkg/filemanager/fs/dbfs/dbfs.go b/pkg/filemanager/fs/dbfs/dbfs.go index c060093..7d57c7d 100644 --- a/pkg/filemanager/fs/dbfs/dbfs.go +++ b/pkg/filemanager/fs/dbfs/dbfs.go @@ -770,66 +770,69 @@ func generateSavePath(policy *ent.StoragePolicy, req *fs.UploadRequest, user *en currentTime := time.Now() originName := req.Props.Uri.Name() - dynamicReplace := func(regPattern string, rule string) string { + dynamicReplace := func(regPattern string, rule string, pathAvailable bool) string { re := regexp.MustCompile(regPattern) return re.ReplaceAllStringFunc(rule, func(match string) string { switch match { - case "{timestamp}": - return strconv.FormatInt(currentTime.Unix(), 10) - case "{timestamp_nano}": - return strconv.FormatInt(currentTime.UnixNano(), 10) - case "{datetime}": - return currentTime.Format("20060102150405") - case "{date}": - return currentTime.Format("20060102") - case "{year}": - return currentTime.Format("2006") - case "{month}": - return currentTime.Format("01") - case "{day}": - return currentTime.Format("02") - case "{hour}": - return currentTime.Format("15") - case "{minute}": - return currentTime.Format("04") - case "{second}": - return currentTime.Format("05") - case "{uid}": - return strconv.Itoa(user.ID) - case "{randomkey16}": - return util.RandStringRunes(16) - case "{randomkey8}": - return util.RandStringRunes(8) - case "{randomnum8}": - return strconv.Itoa(rand.Intn(8)) - case "{randomnum4}": - return strconv.Itoa(rand.Intn(4)) - case "{randomnum3}": - return strconv.Itoa(rand.Intn(3)) - case "{randomnum2}": - return strconv.Itoa(rand.Intn(2)) - case "{uuid}": - return uuid.Must(uuid.NewV4()).String() - case "{path}": + case "{timestamp}": + return strconv.FormatInt(currentTime.Unix(), 10) + case "{timestamp_nano}": + return strconv.FormatInt(currentTime.UnixNano(), 10) + case "{datetime}": + return currentTime.Format("20060102150405") + case "{date}": + return currentTime.Format("20060102") + case "{year}": + return currentTime.Format("2006") + case "{month}": + return currentTime.Format("01") + case "{day}": + return currentTime.Format("02") + case "{hour}": + return currentTime.Format("15") + case "{minute}": + return currentTime.Format("04") + case "{second}": + return currentTime.Format("05") + case "{uid}": + return strconv.Itoa(user.ID) + case "{randomkey16}": + return util.RandStringRunes(16) + case "{randomkey8}": + return util.RandStringRunes(8) + case "{randomnum8}": + return strconv.Itoa(rand.Intn(8)) + case "{randomnum4}": + return strconv.Itoa(rand.Intn(4)) + case "{randomnum3}": + return strconv.Itoa(rand.Intn(3)) + case "{randomnum2}": + return strconv.Itoa(rand.Intn(2)) + case "{uuid}": + return uuid.Must(uuid.NewV4()).String() + case "{path}": + if pathAvailable { return req.Props.Uri.Dir() + fs.Separator - case "{originname}": - return originName - case "{ext}": - return filepath.Ext(originName) - case "{originname_without_ext}": - return strings.TrimSuffix(originName, filepath.Ext(originName)) - default: - return match + } + return match + case "{originname}": + return originName + case "{ext}": + return filepath.Ext(originName) + case "{originname_without_ext}": + return strings.TrimSuffix(originName, filepath.Ext(originName)) + default: + return match } }) } dirRule := policy.DirNameRule dirRule = filepath.ToSlash(dirRule) - dirRule = dynamicReplace(`\{[^{}]+\}`, dirRule) + dirRule = dynamicReplace(`\{[^{}]+\}`, dirRule, true) nameRule := policy.FileNameRule - nameRule = dynamicReplace(`\{[^{}]+\}`, nameRule) + nameRule = dynamicReplace(`\{[^{}]+\}`, nameRule, false) return path.Join(path.Clean(dirRule), nameRule) }