Skip to content

Commit f7bc4cc

Browse files
committed
fix: 修正 windows 因为路径分隔符不同导致 Filename 函数的死循环
1 parent b27bd97 commit f7bc4cc

2 files changed

Lines changed: 11 additions & 9 deletions

File tree

save.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"mime/multipart"
1212
"os"
1313
"path"
14-
"path/filepath"
1514
"strconv"
1615
"strings"
1716
"sync"
@@ -71,7 +70,7 @@ type localSaver struct {
7170
// func(dir fs.FS, filename, ext string) string
7271
//
7372
// dir 为所属的文件系统,filename 为文件名部分,可能包含部分目录名称,ext 为 filename 中的扩展名部分,
74-
// 返回值是修正后的 filename,实现者需要保证 filename 在 dir 下是唯一的。
73+
// 返回值是修正后的 filename,实现者需要保证 filename 在 dir 下是唯一的,filename 的路径分隔符必须是 /,不随系统而改变
7574
// 如果为空,则会采用 [Filename] 作为默认值;
7675
func NewLocalSaver(root *os.Root, baseURL, format string, f func(dir fs.FS, filename, ext string) string) (Deleter, error) {
7776
if root == nil {
@@ -121,7 +120,7 @@ func (s *localSaver) Save(f multipart.File, filename, ext string) (string, error
121120
return "", err
122121
}
123122

124-
return s.baseURL + path.Join(relDir, filepath.Base(p)), nil
123+
return s.baseURL + path.Join(relDir, path.Base(p)), nil
125124
}
126125

127126
func (s *localSaver) Delete(filename string) error {
@@ -134,7 +133,7 @@ func (s *localSaver) createFile(relDir string, filename, ext string) (string, *o
134133
s.moveMux.Lock()
135134
defer s.moveMux.Unlock()
136135

137-
p := s.filenames(s.root.FS(), filepath.Join(relDir, filename), ext)
136+
p := s.filenames(s.root.FS(), path.Join(relDir, filename), ext)
138137
destFile, err := s.root.Create(p)
139138
if err != nil {
140139
return "", nil, err
@@ -149,14 +148,14 @@ func Filename(dir fs.FS, s, ext string) string {
149148
base := strings.TrimSuffix(s, ext)
150149

151150
count := 1
152-
path := s
151+
p := s
153152

154153
RET:
155-
if _, err := fs.Stat(dir, path); errors.Is(err, os.ErrNotExist) {
156-
return path
154+
if _, err := fs.Stat(dir, p); errors.Is(err, os.ErrNotExist) {
155+
return p
157156
}
158157

159-
path = base + "_" + strconv.Itoa(count) + ext
158+
p = base + "_" + strconv.Itoa(count) + ext
160159
count++
161160
goto RET
162161
}

save_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import (
1111
"github.com/issue9/assert/v4"
1212
)
1313

14-
var _ Saver = &localSaver{}
14+
var (
15+
_ Saver = &localSaver{}
16+
_ Deleter = &localSaver{}
17+
)
1518

1619
func TestFilename(t *testing.T) {
1720
a := assert.New(t, false)

0 commit comments

Comments
 (0)