通过 &gintool.Upload{} 对象可以快速实现基于 Gin 框架的文件上传功能,相关属性配置详见下面的示例源码注释部分。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="提交" />
</form>
</body>
</html>
package main
import (
"fmt"
"html/template"
"github.com/cnlesscode/gotool/gintool"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// 处理上传
r.POST("/upload", func(ctx *gin.Context) {
uploader := &gintool.Upload{}
// 文件域名称
uploader.FileName = "file"
// 文件大小限制, 单位 M
uploader.MaxSize = 10
// 允许的类型
// * 代表全部类型
uploader.AllowTypes = "image/png,image/jpg"
// 允许的扩展名
// * 代表全部
uploader.AllowExeNames = "png,jpg,jpeg"
// 目标文件夹
uploader.TargetDir = "./static"
// 文件夹命名规则
// 默认空 : 空代表使用目标文件夹
// year : 每年新建一个文件夹
// month : 每月新建一个文件夹
// day : 每天新建一个文件夹
uploader.DirNamingRule = "month"
// 文件命名规则
// 默认空 : 空代表使用上传时的文件名
// random : 随机字符串形式的文件名
uploader.FileNamingRule = "random"
filePath, err := uploader.Run(ctx)
if err == nil {
ctx.JSON(200, gin.H{"filePath": filePath})
} else {
fmt.Printf("err: %v\n", err)
fmt.Printf("uploader.ExtendName: %v\n", uploader.ExtendName)
fmt.Printf("uploader.FileType: %v\n", uploader.FileType)
ctx.JSON(200, gin.H{"error": err.Error()})
}
})
// 展示上传视图
r.GET("/", func(ctx *gin.Context) {
t, _ := template.ParseFiles("./templates/upload.html")
t.Execute(ctx.Writer, gin.H{})
})
// 监听指定端口
r.Run(":8080")
}