Day05:Gin框架快速入门04 文件上传和下载| 青训营

简介: Day05:Gin框架快速入门04 文件上传和下载| 青训营

导读

本套笔记是为了学习过其他语言框架,想要快速掌握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() //设置运行接口  
}

当运行之后,前端发送的文件就会在我们后端文件里存储

image.png

image.png

可以看到成功获取。

服务端保存文件的方法

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

运行之后发送文件,可以在控制台获得信息

image.png

我们发送了一张图片,所以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运行结果

image.png

image.png

可以看到成功创建了两张图片

文件下载

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 来进行文件下载。 当我们运行点击之后就会下载

image.png

前后端分离的文件下载

这个时候我们只需要管后端的内容即可,前端的我们不用管

我们只需要响应一个文件数据

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接受结果

image.png


相关文章
|
存储 缓存 安全
90%的Go语言程序员map遍历方式都是错的
90%的Go语言程序员map遍历方式都是错的
618 0
|
中间件 Go 数据库
Go开发者必读:Gin框架的实战技巧与最佳实践
在当今快速发展的互联网时代,Web开发的需求日益增长。Go语言以其简洁、高效、并发性强的特点,成为了开发者们的首选。而在Go语言的众多Web框架中,Gin无疑是其中的佼佼者。本文将深入探讨Gin框架的特性、优势以及如何利用Gin构建高性能的Web应用。
|
XML 域名解析 JSON
【RESTful】RESTful API 接口设计规范 | 示例
【RESTful】RESTful API 接口设计规范 | 示例
12902 0
【RESTful】RESTful API 接口设计规范 | 示例
|
消息中间件 Java 中间件
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。接下来我就将从零开始介绍什么是消息队列?消息队列的应用场景?如何进行选型?如何在Spring Boot项目中整合集成消息队列。
25063 10
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
|
JSON 应用服务中间件 API
使用 Gin 框架实现文件上传:机制与深入解析
使用 Gin 框架实现文件上传:机制与深入解析
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
2131 1
|
编译器 Go API
go generate指南:代码自动生成
go generate指南:代码自动生成
3850 0
|
缓存 JavaScript 前端开发
拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
9566 2
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
125561 0