单文件上传

定义模板

1
2
3
4
5
6
7
8
<body>
<h2>文件上传</h2>
<form action="/admin/doUpload" method="post" enctype="multipart/form-data">
用户名: <input type="text" name="username" placeholder="用户名"> <br> <br>
文 件:<input type="file" name="file"><br> <br>
<input type="submit" value="提交">
</form>
</body>

注意:enctype="multipart/form-data"不能漏

添加控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func (c AdminController) DoUpload(con *gin.Context) {
username := con.PostForm("username")
file, err := con.FormFile("file")

if err != nil {
con.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
})
return
}

dst := path.Join("./static/upload", file.Filename)
fmt.Println(dst)
con.SaveUploadedFile(file, dst)
con.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("'%s',uploaded!", file.Filename),
"username": username,
})
}

文件的保存文件夹应当提前创建好

配置路由

1
adminRouters.POST("/doUpload", admin.AdminController{}.DoUpload)


多文件上传

对于多文件,可以拆成多个单文件分别手动处理,也可以按照如下的方式

模板

1
2
3
4
5
6
7
8
9
<body>
<h2>文件上传</h2>
<form action="/admin/doUpload" method="post" enctype="multipart/form-data">
用户名: <input type="text" name="username" placeholder="用户名"> <br> <br>
文 件1:<input type="file" name="file[]"><br> <br>
文 件2:<input type="file" name="file[]"><br> <br>
<input type="submit" value="提交">
</form>
</body>

控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func (c AdminController) DoUpload(con *gin.Context) {
username := con.PostForm("username")

form, _ := con.MultipartForm()
files := form.File["file[]"]

for _, file := range files {
dst := path.Join("./static/upload", file.Filename)
con.SaveUploadedFile(file, dst)
}

con.JSON(http.StatusOK, gin.H{
"message": "文件上传成功",
"username": username,
})

}


检查后缀并按日期保存

在上面的例子中,保存文件时文件名都没有修改,这将带来两个缺点:

  • 太乱了
  • 同名文件会被覆盖

于是,按时间保存就非常有必要,下面将以上传图片为例来演示

总体思路:

  1. 获取上传的文件
  2. 获取后缀名,判断是否是图片
  3. 创建图片保存目录
  4. 生成文件名称
  5. 保存文件

首先在tools.go中添加两个全局方法

1
2
3
4
5
6
7
8
func GetUnix() int64 {
return time.Now().Unix()
}

func GetDay() string {
template := "20060102"
return time.Now().Format(template)
}

adminController.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
func (c AdminController) DoUpload(con *gin.Context) {
username := con.PostForm("username")

//1获取上传的文件
file, _ := con.FormFile("file")

//2获取后缀名,判断是否是图片
extName := path.Ext(file.Filename)
allowExtMap := map[string]bool{
".jpg": true,
".png": true,
".gif": true,
".jpge": true,
}

if _, ok := allowExtMap[extName]; !ok {
con.String(http.StatusOK, "文件类型不合法")
return
}

//3创建图片保存目录
day := models.GetDay()
dir := "./static/upload/" + day + "/"
if err := os.MkdirAll(dir, 0666); err != nil {
fmt.Println(err)
return
}

//4生成文件名称
filename := strconv.FormatInt(models.GetUnix(), 10) + extName

//5保存文件
con.SaveUploadedFile(file, dir+filename)

con.JSON(http.StatusOK, gin.H{
"message": "文件上传成功",
"username": username,
})
}