单文件上传
package main
func main() {
router := gin.Default()
//为multipart forms 设置较低的内存限制 (默认32MiB)
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
username := c.PostForm("username")
// 单文件
file, _ := c.FormFile("face")
log.Println(file.Filename)//文件名
//**拼接路径** ./基于根目录
dst := path.Join("./static/uploads", file.Filename)
//上传文件到指定目录 static/uploads
c.SaveUploadedFile(file, dst)
c.JSON(200, gin.H{
"success": true,
"username": username,
"dst": dst,
})
})
router.Run(":8080")
}
- 简单的伤处页面(这个是写在模板里面的)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- enctype="multipart/form-data" 需要加 -->
<form action='/upload' method='post' enctype="multipart/form-data">
<input name='username' />
<br />
<!-- 这个那么对应 c.FormFile("face")的字符串 -->
<input type='file' name='face'/>
</form>
</body>
</html>
多文件上传
- 文件名相同
- 文件名不同
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- enctype="multipart/form-data" 需要加 -->
<form action='/upload' method='post' enctype="multipart/form-data">
<input name='username' />
<br />
<!-- 这个那么对应 c.FormFile("face1")的字符串 -->
<input type='file' name='face1'/>
<input type='file' name='face2'/>
</form>
</body>
</html>
- 例子- 不同名字的多个文件上传
- 本质就是多个单文件上传
package main
func main() {
router := gin.Default()
//为multipart forms 设置较低的内存限制 (默认32MiB)
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
username := c.PostForm("username")
// 多文件
file, err := c.FormFile("face1")
if err == nil {
//**拼接路径** ./基于根目录
dst := path.Join("./static/uploads", file.Filename)
//上传文件到指定目录 static/uploads
c.SaveUploadedFile(file, dst)
}
file2, err2 := c.FormFile("face2")
if err2 == nil {
//**拼接路径** ./基于根目录
dst := path.Join("./static/uploads", file2.Filename)
//上传文件到指定目录 static/uploads
c.SaveUploadedFile(file2, dst)
}
c.JSON(200, gin.H{
"success": true,
"username": username,
"dst": dst,
})
})
router.Run(":8080")
}
相同name的多文件上传
func main() {
router := gin.Default()
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// Multipart form
form, _ := c.MultipartForm()
files := form.File["face[]"]
for _, file := range files {
//**拼接路径** ./基于根目录
dst := path.Join("./static/uploads", file.Filename)
c.SaveUploadedFile(file, dst)
}
c.JSON(200, gin.H{
"success": true,
"username": username,
})
})
router.Run(":8080")
}
- 简单的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- enctype="multipart/form-data" 需要加 -->
<form action='/upload' method='post' enctype="multipart/form-data">
<input name='username' />
<br />
<input type='file' name='face[]'/>
<input type='file' name='face[]'/>
</form>
</body>
</html>
按照日期存储文件
package main
func main() {
router := gin.Default()
//为multipart forms 设置较低的内存限制 (默认32MiB)
router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
username := c.PostForm("username")
// 单文件
file, err := c.FormFile("face")
if err == nil {
// 获取文件后缀 .jpg .png .gif .jpeg
extName := path.Ext(file.Filename)
// 创建图表保存的目录 static/uploads/20250219
allowExtMap := map[string]bool{
".jpg": true,
".png": true,
".gif": true,
".jpeg": true,
}
if v, ok = allowExtMap[extName]; !ok {
c.String(200, "上传的文件格式不对")
return
}
// 生成文件名称和文件保存的目录
template := "20060102"
t := time.Now().Format(template)//生成年月日
dir := path.Join("./static/uploads", t)
// 目录是否存在
err := os.Chmod(dir, 0666)
if err != nil {
c.String(200, "创建目录失败")
return
}
unix := time.Now().Unix()
//生成文件名
fileName := strconv.FormatInt(unix, 10) + extName
dst := path.Join(dir, fileName)
//上传文件到指定目录 static/uploads
c.SaveUploadedFile(file, dst)
}
c.JSON(200, gin.H{
"success": true,
"username": username,
})
})
router.Run(":8080")
}