0
点赞
收藏
分享

微信扫一扫

【Gin框架】上传文件


阅读目录

  • ​​目录​​
  • ​​主文件 E:\gormlearn\gin\magin.go​​
  • ​​路由文件 E:\gormlearn\gin\routers\adminRouters.go​​
  • ​​中间件 E:\gormlearn\gin\middlewares\init.go​​
  • ​​控制器 E:\gormlearn\gin\controllers\admin\userController.go​​
  • ​​控制器基类 E:\gormlearn\gin\controllers\admin\baseController.go​​
  • ​​上传文件 HTML 页面 E:\gormlearn\gin\templates\admin\useradd.html​​
  • ​​运行​​
  • ​​Gin 按照日期存储图片​​
  • ​​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框架】上传文件_前端

【Gin框架】上传文件_java_02

【Gin框架】上传文件_上传_03

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


举报

相关推荐

0 条评论