浅谈Gin框架的使用(二)

123 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

今天接着学习Gin框架入门(二),今天介绍文件上传、会话控制

文件上传

上传单个文件

  • 文件上传的格式:multipart/form-data
  • gin文件上传与原生的net/http方法类似,不同在于gin把原生的request集成到了c.Request

前端上传文件界面:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>上传文件</title>
</head>
<body>
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
    上传文件:<input type="file" name="file">
    <input type="submit" value="上传">
</form>
</body>
</html>

multipart/forms格式提交的文件大小默认是32 MiB

router.MaxMultipartMemory = 8 << 20 :可以修改上传文件最大大小

package main

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

func main() {
    r := gin.Default()    
    //限制上传最大尺寸
    r.MaxMultipartMemory = 8 << 20
    r.POST("/upload", func(c *gin.Context) {
        file, err := c.FormFile("file")
        if err != nil {
            c.String(500, "上传图片出错")
        }        
        //保存文件到指定文件夹
        c.SaveUploadedFile(file, file.Filename)
        c.String(http.StatusOK, file.Filename)
    })
    r.Run()
}

image.png

image.png

上传多个文件

func main() {
   // 1.创建路由
   r := gin.Default()
   // 限制表单上传大小 8MB,默认为32MB
   r.MaxMultipartMemory = 8 << 20
   r.POST("/upload", func(c *gin.Context) {
      form, err := c.MultipartForm()
      if err != nil {
         c.String(http.StatusBadRequest, fmt.Sprintf("get err %s", err.Error()))
      }
      // 获取所有图片
      files := form.File["files"]
      // 遍历所有图片
      for _, file := range files {
         // 单独保存
         if err := c.SaveUploadedFile(file, file.Filename); err != nil {
            c.String(http.StatusBadRequest, fmt.Sprintf("upload err %s", err.Error()))
            return
         }
      }
      c.String(200, fmt.Sprintf("upload ok %d files", len(files)))
   })
   //默认端口号是8080
   r.Run(":8000")
}

image.png

会话控制

Cookie介绍

  • HTTP是无状态协议,服务器不能记录浏览器的访问状态,服务器区分不出两次请求是否来自同一个终端
  • Cookie就是设计来解决HTTP协议无状态的方案之一
  • Cookie实际上就是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求时都会同时携带Cookie信息,服务器收到请求后,就可以根据该信息处理请求
  • Cookie由服务器创建,并发送给浏览器,最终由浏览器保存

Cookie的使用

package main

import (
   "github.com/gin-gonic/gin"
   "fmt"
)

func main() {
   // 1.创建路由
   r := gin.Default()
   // 服务端要给客户端cookie
   r.GET("cookie", func(c *gin.Context) {
      // 获取客户端是否携带cookie
      cookie, err := c.Cookie("key_cookie")
      if err != nil {
         cookie = "NotSet"
         // 给客户端设置cookie        
         c.SetCookie("key_cookie", "value_cookie", 60, "/",
            "localhost", false, true)
      }
      fmt.Printf("cookie的值是: %s\n", cookie)
   })
   r.Run(":8000")
}
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) 
//naxAge int, 单位为秒
// path,cookie 所在目录
// domain string:域名
// secure 是否只能通过https访问
// httpOnly bool  是否允许别人通过js获取自己的cookie

Cookie的缺点

  • 存储的数据不安全,明文存储
  • 每次携带额外的消息,会增加带宽消耗
  • 数量有上限
  • 可以禁用计算机上的cookie

总结

今天简单的学习了Gin文件上传、会话控制知识,接来下会继续学习Gin的中间件等知识,对于刚入门go语言的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!