Skip to content

Commit 1b09801

Browse files
committed
feat: 添加 None
1 parent b15295a commit 1b09801

3 files changed

Lines changed: 53 additions & 16 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ _testmain.go
3434

3535
example/upload/
3636
testdir/20*/
37+
testdir/file_1.xml

save.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@ type Saver interface {
2727

2828
// Save 保存用户上传的文件
2929
//
30-
// filename 为用户上传时的文件名,包含扩展名部分
30+
// filename 为用户上传时的文件名,不包含扩展名部分
3131
// ext 为 filename 中的扩展名部分;
3232
// 返回该文件对应的唯一标记。
3333
Save(file multipart.File, filename string, ext string) (string, error)
3434
}
3535

3636
// 为 [New] 的参数 format 所允许的几种取值
3737
const (
38+
None = ""
3839
Year = "2006/"
3940
Month = "2006/01/"
4041
Day = "2006/01/02/"
@@ -55,7 +56,7 @@ type localSaver struct {
5556
//
5657
// baseURL 为上传的文件生成访问地址的前缀;
5758
//
58-
// format 子目录的格式,只能是时间格式,取值只能是 [Year]、[Month] 和 [Day];
59+
// format 子目录的格式,只能是时间格式,取值只能是 [None]、[Year]、[Month] 和 [Day];
5960
//
6061
// f 设置文件名的生成方式,要求文件在同一目录下具有唯一性,其类型如下:
6162
//
@@ -77,7 +78,7 @@ func NewLocalSaver(dir, baseURL, format string, f func(dir, filename, ext string
7778
dir += string(filepath.Separator)
7879
}
7980

80-
if format != Year && format != Month && format != Day {
81+
if format != Year && format != Month && format != Day &&format != None{
8182
panic("无效的参数 format")
8283
}
8384

@@ -112,8 +113,12 @@ func NewLocalSaver(dir, baseURL, format string, f func(dir, filename, ext string
112113
func (s *localSaver) Open(name string) (fs.File, error) { return s.fs.Open(name) }
113114

114115
func (s *localSaver) Save(f multipart.File, filename string, ext string) (string, error) {
115-
relDir := time.Now().Format(s.format)
116+
var relDir string
117+
if s.format != None {
118+
relDir = time.Now().Format(s.format)
119+
}
116120
dir := s.dir + relDir
121+
117122
if err := os.MkdirAll(dir, presetMode); err != nil { // 若路径不存在,则创建
118123
return "", err
119124
}

upload_test.go

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2015-2024 caixw
1+
// SPDX-FileCopyrightText: 2015-2025 caixw
22
//
33
// SPDX-License-Identifier: MIT
44

@@ -65,26 +65,57 @@ func TestUpload_Do(t *testing.T) {
6565
f, err := os.Open(filename)
6666
a.NotError(err).NotNil(f)
6767

68-
body := &bytes.Buffer{}
69-
writer := multipart.NewWriter(body)
70-
fw, err := writer.CreateFormFile("file", filename)
71-
a.NotError(err).NotNil(fw)
68+
body,ct :=formData(a, filename)
7269

73-
_, err = io.Copy(fw, f)
74-
a.NotError(err)
70+
r, err := http.NewRequest(http.MethodPost, "/upload", body)
71+
r.Header.Add("content-type", ct)
72+
a.NotError(err).NotNil(r)
7573

76-
err = writer.WriteField("filename", filename)
77-
a.NotError(err)
74+
paths, err := u.Do("file", r)
75+
a.NotError(err).
76+
Length(paths, 1).
77+
Equal(paths[0], "https://example.com/"+path.Join(time.Now().Format(Day), "file.xml"))
78+
}
7879

79-
err = writer.Close() // close writer before POST request
80+
func TestUpload_Do_None(t *testing.T) {
81+
a := assert.New(t, false)
82+
s, err := NewLocalSaver("./testdir", "https://example.com", None, Filename)
83+
a.NotError(err).NotNil(s)
84+
85+
u := New(s, 10*1024, "xml")
8086
a.NotError(err)
87+
filename := "./testdir/file.xml"
88+
89+
f, err := os.Open(filename)
90+
a.NotError(err).NotNil(f)
91+
92+
body,ct :=formData(a, filename)
8193

8294
r, err := http.NewRequest(http.MethodPost, "/upload", body)
83-
r.Header.Add("content-type", writer.FormDataContentType())
95+
r.Header.Add("content-type", ct)
8496
a.NotError(err).NotNil(r)
8597

8698
paths, err := u.Do("file", r)
8799
a.NotError(err).
88100
Length(paths, 1).
89-
Equal(paths[0], "https://example.com/"+path.Join(time.Now().Format(Day), "file.xml"))
101+
Equal(paths[0], "https://example.com/"+ "file_1.xml") // 已经 file.xml
102+
}
103+
104+
func formData(a*assert.Assertion,filename string) (*bytes.Buffer,string) {
105+
f, err := os.Open(filename)
106+
a.NotError(err).NotNil(f)
107+
108+
body := &bytes.Buffer{}
109+
writer := multipart.NewWriter(body)
110+
fw, err := writer.CreateFormFile("file", filename)
111+
a.NotError(err).NotNil(fw)
112+
113+
_, err = io.Copy(fw, f)
114+
a.NotError(err)
115+
116+
ct :=writer.FormDataContentType()
117+
err = writer.Close() // close writer before POST request
118+
a.NotError(err)
119+
120+
return body,ct
90121
}

0 commit comments

Comments
 (0)