开启掘金成长之旅!这是我参与「掘金日新计划 · 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()
}
上传多个文件
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")
}
会话控制
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语言的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!