单文件上传
定义模板
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, })
}
|


检查后缀并按日期保存
在上面的例子中,保存文件时文件名都没有修改,这将带来两个缺点:
于是,按时间保存就非常有必要,下面将以上传图片为例来演示
总体思路:
- 获取上传的文件
- 获取后缀名,判断是否是图片
- 创建图片保存目录
- 生成文件名称
- 保存文件
首先在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")
file, _ := con.FormFile("file")
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 }
day := models.GetDay() dir := "./static/upload/" + day + "/" if err := os.MkdirAll(dir, 0666); err != nil { fmt.Println(err) return }
filename := strconv.FormatInt(models.GetUnix(), 10) + extName
con.SaveUploadedFile(file, dir+filename)
con.JSON(http.StatusOK, gin.H{ "message": "文件上传成功", "username": username, }) }
|

