26-文件上传

5 阅读2分钟

单文件上传

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")
}