Gin框架上传文件

Posted 知其黑、受其白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gin框架上传文件相关的知识,希望对你有一定的参考价值。

阅读目录

目录

-- gin
    |-- controllers
    |   |-- admin
    |   |   |-- baseController.go
    |   |   `-- userController.go
    |   `-- wgchen
    |       `-- defaultController.go
    |-- go.mod
    |-- go.sum
    |-- magin.go
    |-- middlewares
    |   `-- init.go
    |-- models
    |   `-- tools.go
    |-- routers
    |   |-- adminRouters.go
    |   `-- defaultRouters.go
    |-- static
    |   `-- upload
    |       `-- 81.jpg
    `-- templates
        |-- admin
        |   `-- useradd.html
        `-- default
            `-- index.html

主文件 E:\\gormlearn\\gin\\magin.go

package main

import (
	"html/template"
	"wgchen/models"
	"wgchen/routers"

	"github.com/gin-gonic/gin"
)

func main() 
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 自定义模板函数  注意要把这个函数放在加载模板前
	r.SetFuncMap(template.FuncMap
		"UnixToTime": models.UnixToTime,
	)
	//加载模板 放在配置路由前面
	r.LoadHTMLGlob("templates/**/*")
	//配置静态web目录   第一个参数表示路由, 第二个参数表示映射的目录
	r.Static("/static", "./static")

	// 路由文件
	routers.DefaultRoutersInit(r)
	routers.AdminRoutersInit(r)

	// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
	r.Run(":8080")

路由文件 E:\\gormlearn\\gin\\routers\\adminRouters.go

package routers

import (
	"wgchen/controllers/admin"
	"wgchen/middlewares"

	"github.com/gin-gonic/gin"
)

func AdminRoutersInit(r *gin.Engine) 
	// middlewares.InitMiddleware 中间件
	adminRouters := r.Group("/admin", middlewares.InitMiddleware)
	
		adminRouters.GET("/user/add", admin.UserController.Add)
		adminRouters.POST("/user/doUpload", admin.UserController.DoUpload)
	

中间件 E:\\gormlearn\\gin\\middlewares\\init.go

package middlewares

import (
	"fmt"
	"time"

	"github.com/gin-gonic/gin"
)

func InitMiddleware(c *gin.Context) 
	//判断用户是否登录
	fmt.Println(time.Now())
	fmt.Println(c.Request.URL)

	c.Set("username", "张三")

	/*
		定义一个goroutine统计日志
		当在中间件或 handler 中启动新的 goroutine 时,
		不能使用原始的上下文(c *gin.Context),
		必须使用其只读副本(c.Copy())
	*/
	cCp := c.Copy()
	go func() 
		time.Sleep(2 * time.Second)
		fmt.Println("Done! in path " + cCp.Request.URL.Path)
	()

控制器 E:\\gormlearn\\gin\\controllers\\admin\\userController.go

接收上传文件。

package admin

import (
	"net/http"
	"path"

	"github.com/gin-gonic/gin"
)

type UserController struct 
	BaseController


//	func (con UserController) Index(c *gin.Context) 
//		// c.String(200, "用户列表--")
//		con.success(c)
//	
func (con UserController) Add(c *gin.Context) 
	// fmt.Println("ccc")
	// os.Exit(123)
	c.HTML(http.StatusOK, "admin/useradd.html", gin.H)


func (con UserController) DoUpload(c *gin.Context) 
	username := c.PostForm("username")
	file, err := c.FormFile("face")

	// file.Filename 获取文件名称 aa.jpg ./static/upload/aaa.jpg
	dst := path.Join("./static/upload", file.Filename)
	
	// fmt.Println(dst)
	// os.Exit(123)
	if err == nil 
		c.SaveUploadedFile(file, dst)
	
	// c.String(200, "执行上传")
	c.JSON(http.StatusOK, gin.H
		"success":  true,
		"username": username,
		"dst":      dst,
	)

控制器基类 E:\\gormlearn\\gin\\controllers\\admin\\baseController.go

package admin

import "github.com/gin-gonic/gin"

type BaseController struct

func (con BaseController) success(c *gin.Context) 
	c.String(200, "成功")


func (con BaseController) error(c *gin.Context) 
	c.String(200, "失败")

上传文件 HTML 页面 E:\\gormlearn\\gin\\templates\\admin\\useradd.html

 define "admin/useradd.html" 

<!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>
<h2>演示文件上传</h2>
<form action="/admin/user/doUpload" method="post" enctype="multipart/form-data">
    用户名: <input type="text" name="username" placeholder="用户名"> <br> <br>
    头像:<input type="file" name="face"><br> <br>
    <input type="submit" value="提交">
</form>

</body>
</html>

 end 

运行

Gin 按照日期存储图片

/*
	1、获取上传的文件
	2、获取后缀名 判断类型是否正确  .jpg .png .gif .jpeg
	3、创建图片保存目录  static/upload/20200623
	4、生成文件名称和文件保存的目录
	5、执行上传
*/
func (con UserController) DoUpload(c *gin.Context) 
	username := c.PostForm("username")
	// 1、获取上传的文件
	file, err := c.FormFile("face")

	if err == nil 
		// 2、获取后缀名 判断类型是否正确  .jpg .png .gif .jpeg
		extName := path.Ext(file.Filename)

		allowExtMap := map[string]bool
			".jpg":  true,
			".png":  true,
			".gif":  true,
			".jpeg": true,
		

		if _, ok := allowExtMap[extName]; !ok 
			c.String(200, "上传的文件类型不合法")
			return
		

		// 3、创建图片保存目录  static/upload/20210624

		day := models.GetDay()
		dir := "./static/upload/" + day

		err := os.MkdirAll(dir, 0666)
		if err != nil 
			fmt.Println(err)
			c.String(200, "MkdirAll失败")
			return
		

		// 4、生成文件名称和文件保存的目录   111111111111.jpeg
		fileName := strconv.FormatInt(models.GetUnix(), 10) + extName

		// 5、执行上传
		dst := path.Join(dir, fileName)
		c.SaveUploadedFile(file, dst)
	
	c.JSON(http.StatusOK, gin.H
		"success":  true,
		"username": username,
	)

Gin中实现单文件上传 多文件上传

func (con UserController) DoUpload(c *gin.Context) 
	username := c.PostForm("username")

	form, _ := c.MultipartForm()
	files := form.File["face[]"]

	for _, file := range files 
		dst := path.Join("./static/upload", file.Filename)
		// 上传文件至指定目录
		c.SaveUploadedFile(file, dst)
	

	c.JSON(http.StatusOK, gin.H
		"success":  true,
		"username": username,
	)

以上是关于Gin框架上传文件的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# Golang Gin 框架上传介绍

Gin框架之文件上传

Gin框架快速入门

Gin框架快速入门

Golang实践录:使用gin框架实现文件上传转发功能

Golang Gin 框架上传介绍