导读
本套笔记是为了学习过其他语言框架,想要快速掌握gin框架推行的一套笔记。 虽然为了青训营而制作的一套笔记,但其他想要学go的程序员也可以通过这个上手go世界,后续会带你快速上手gorm,学完这两个之后,简体版抖音基本上就可以独立完成了,后续还会进行大项目的讲解开发,制作不易,喜欢的就点个关注吧。
注意
代码详解大部分是注释的形式给出,请留意代码注释。
Gin框架介绍
导读:Gin是一个非常受欢迎的Golang Web框架,它旨在提供高性能、易用和轻量级的解决方案。
文件上传
单文件
前端给我们发送文件,我们用来接收,例如上传头像,上传视频等,goland代码如下
package main import ( "fmt" "github.com/gin-gonic/gin" //引入框架 "log" "net/http" ) func get(c *gin.Context) { //用于从 HTTP 请求中解析和获取指定名称的文件 file, _ := c.FormFile("file") //日志里面打印获得的文件的名字 log.Println(file.Filename) //dst是想要放到的位置 dst := "./" + file.Filename c.SaveUploadedFile(file, dst) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) } func main() { router := gin.Default() //设置路由 //设置了路由器(router)的最大多部分表单数据内存大小 //8 << 20 表示将数字 8 左移 20 位,相当于将 8 乘以 2 的 20 次方,也就是 8MB //router.MaxMultipartMemory 是一个整数类型的变量,用于表示路由器处理多部分表单数据时的最大内存限制 //这意味着当路由器接收到的多部分表单数据超过 8MB 时,系统将无法处理该数据 router.MaxMultipartMemory = 8 << 20 router.GET("/form", get) router.Run() //设置运行接口 }
当运行之后,前端发送的文件就会在我们后端文件里存储
可以看到成功获取。
服务端保存文件的方法
SaveUploadedFile
也就是我们上面使用的
c.SaveUploadedFile(file, dst) // 文件对象 文件路径,注意要从项目根路径开始写
Creat + Copy
先创建文件,之后把文件内容复制,我们只需要改变get方法即可。
func get(c *gin.Context) { //用于从 HTTP 请求中解析和获取指定名称的文件 file, _ := c.FormFile("file") //日志里面打印获得的文件的名字 log.Println(file.Filename) //这行代码用于打开一个文件,以便进行读取操作 //fileRead 是一个变量,用于存储打开后的文件读取对象 fileRead, _ := file.Open() //dst是想要放到的位置 dst := "./" + file.Filename //这行代码用于创建一个新文件,并返回一个用于写入文件内容的对象 //Create(dst) 是os包中的一个函数,用于创建一个新文件,并返回一个可以写入文件内容的文件对象。 out, err := os.Create(dst) //检查错误 if err != nil { fmt.Println(err) } //这行代码用于在函数执行完毕后延迟关闭文件 //defer 是Go语言的关键字,用于延迟执行某个函数或方法 defer out.Close() //拷贝文件对象到out中 io.Copy(out, fileRead) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }
运行效果与上面的一致
读取上传的文件
可以检验里面的内容,例如我们可以基于文件中的内容,判断是否需要保存到服务器中
func get(c *gin.Context) { //用于从 HTTP 请求中解析和获取指定名称的文件 file, _ := c.FormFile("file") //这行代码用于打开一个文件,以便进行读取操作 //fileRead 是一个变量,用于存储打开后的文件读取对象 fileRead, _ := file.Open() //这行代码用于读取打开的文件中的所有内容,并将其存储在 data 变量中 //ReadAll() 是io 包中的一个函数,用于从给定的可读取对象中读取所有数据,并将其存储为字节切片([]byte) data, _ := io.ReadAll(fileRead) fmt.Println(string(data)) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }
运行之后发送文件,可以在控制台获得信息
我们发送了一张图片,所以string就会打印乱码。
多文件上传
我们使用遍历数组的方式来上传,使用第一种读取。
func get(c *gin.Context) { //这行代码用于从 c 上下文对象中获取用于解析多部分表单数据的表单对象 //MultipartForm() 是上下文对象的一个方法,用于解析包含多部分表单数据的请求体,并返回一个可以访问解析后的表单数据的对象 form, _ := c.MultipartForm() //这行代码用于从表单对象中获取名为 "upload[]" 的多个上传文件字段 files := form.File["upload[]"] //遍历files,之后使用第一种方法保存每一个文件 for _, file := range files { log.Println(file.Filename) // 上传文件至指定目录 c.SaveUploadedFile(file, "./"+file.Filename) } c.String(http.StatusOK, fmt.Sprintf("下载成功")) }
goland和postman运行结果
可以看到成功创建了两张图片
文件下载
package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/download", func(c *gin.Context) { //要下载的文件 filePath := "./640.jpg" fileName := "640.jpg" //由于浏览器的缓存,所以我们需要唤起浏览器的下载功能 //直接复制即可 c.Header("Content-Description", "File Transfer") c.Header("Content-Disposition", "attachment; filename="+fileName) c.Header("Content-Type", "application/octet-stream") c.File(filePath) }) router.Run(":8080") }
启动服务器后,可以通过访问 http://localhost:8080/download
来进行文件下载。 当我们运行点击之后就会下载
前后端分离的文件下载
这个时候我们只需要管后端的内容即可,前端的我们不用管
我们只需要响应一个文件数据
package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/download", func(c *gin.Context) { //要下载的文件 filePath := "./640.jpg" fileName := "640.jpg" //由于浏览器的缓存,所以我们需要唤起浏览器的下载功能 c.Header("fileName", fileName) c.Header("msg", "文件下载成功") c.File(filePath) }) router.Run(":8080") }
postman接受结果