Go学习第十六章——Gin文件上传与下载

这篇具有很好参考价值的文章主要介绍了Go学习第十六章——Gin文件上传与下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 文件上传

1.1 入门案例(单文件)

func main() {
	router := gin.Default()
	// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
	// 单位是字节, << 是左移预算符号,等价于 8 * 2^20
	// gin对文件上传大小的默认值是32MB
	// 1. 设置路由器的最大内存限制为8MB,用于处理multipart表单数据中的文件上传。
	router.MaxMultipartMemory = 8 << 20 // 8 MiB
	// 2. 定义一个路由处理函数
	router.POST("/upload", func(c *gin.Context) {
		// 单文件
		// 3.通过c.FormFile函数获取HTTP请求上传的文件对象。
		//   其中参数"file"是上传表单中文件类型的name属性值。
		file, _ := c.FormFile("file")
		// 使用log包打印上传的文件名。
		log.Println(file.Filename)
		// 4. 指定上传文件的目标完整路径
		dst := "./" + file.Filename
		// 5. 使用c.SaveUploadedFile函数保存文件到指定路径下。
		c.SaveUploadedFile(file, dst)
		// 6. 使用c.String函数向客户端响应上传成功信息。
		c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
	})
	router.Run(":8000")
}

Go学习第十六章——Gin文件上传与下载,golang,学习,gin,开发语言,笔记,后端

1.2 服务端保存文件的几种方式

SaveUploadedFile
func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error

SaveUploadedFile函数用于将文件保存到指定的路径下。第一个参数是文件对象,第二个参数是保存文件的路径。

Create+Copy
func (c *Context) FormFile(name string) (*multipart.FileHeader, error)

FormFile函数用于获取上传的文件。它返回一个文件对象,其中包含了文件的元数据(名称、大小等)。我们可以使用这个文件对象去直接读取文件内容。

func main() {
	router := gin.Default()

	router.MaxMultipartMemory = 8 << 20 // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		file, _ := c.FormFile("file")
		log.Println(file.Filename)
		// 读取文件中的数据,返回文件对象
		fileRead, _ := file.Open()
		dst := "./" + file.Filename
		// 创建一个文件
		out, err := os.Create(dst)
		if err != nil {
			fmt.Println(err)
		}
		defer out.Close()
		// 拷贝文件对象到out中
		io.Copy(out, fileRead)
		c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
	})
	router.Run(":8000")
}

一样是使用Apifox调用,没有什么毛病~

1.3 读取上传的文件

func (c *Context) FormFile(name string) (*multipart.FileHeader, error)

FormFile函数用于获取上传的文件。它返回一个文件对象,其中包含了文件的元数据(名称、大小等)。我们可以使用这个文件对象去直接读取文件内容。

func main() {
	router := gin.Default()

	router.MaxMultipartMemory = 8 << 20 // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		file, _ := c.FormFile("file")
		// 读取文件中的数据,返回文件对象
		fileRead, _ := file.Open()
		defer fileRead.Close()
		data, _ := io.ReadAll(fileRead)
		fmt.Println(string(data))
		c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
	})
	router.Run(":8000")
}

在这里我们可以根据文件的内容来判断是否需要保存到服务器中。

1.4 多文件上传

func (c *Context) MultipartForm() (*multipart.Form, error)

MultipartForm函数用于获取上传的表单数据。它返回一个包含了文件对象的表单对象。

func main() {
	router := gin.Default()
	// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
	router.MaxMultipartMemory = 8 << 20 // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		// Multipart form
		form, _ := c.MultipartForm()
		files := form.File["upload[]"]  // 注意这里名字不要对不上了

		for _, file := range files {
			log.Println(file.Filename)
			// 上传文件至指定目录
			c.SaveUploadedFile(file, "./"+file.Filename)
		}
		c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
	})
	router.Run(":8000")
}

2. 文件下载

2.1 快速入门

直接响应一个路径下的文件

func main() {
    router := gin.Default()
    router.GET("/download", func(c *gin.Context) {
       c.File("思考一个问题的四连问.txt")
    })
    router.Run(":8000")
}

然后,直接在游览器访问,就能下载到了!!

Go学习第十六章——Gin文件上传与下载,golang,学习,gin,开发语言,笔记,后端

但是呐:

有些响应,比如图片,浏览器就会显示这个图片,而不是下载,所以我们需要使浏览器唤起下载行为

c.Header("Content-Type", "application/octet-stream") // 表示是文件流,唤起浏览器下载,一般设置了这个,就要设置文件名
c.Header("Content-Disposition", "attachment; filename="+"牛逼.png") // 用来指定下载下来的文件名
c.Header("Content-Transfer-Encoding", "binary")   // 表示传输过程中的编码形式,乱码问题可能就是因为它
c.File("uploads/12.png")

完整代码:

func main() {
    router := gin.Default()
    router.GET("/download", func(c *gin.Context) {
       c.Header("Content-Type", "application/octet-stream")
       c.Header("Content-Disposition", "attachment; filename="+"牛逼.txt")
       c.File("思考一个问题的四连问.txt")
    })
    router.Run(":8000")
}

这样再使用游览器,就直接下载了!!

2.2 前后端模式下的文件下载

如果是前后端模式下,后端就只需要响应一个文件数据

文件名和其他信息就写在请求头中

c.Header("fileName", "xxx.png")
c.Header("msg", "文件下载成功")
c.File("uploads/12.png")

前端写法

async downloadFile(row) {
   this.$http({
      method: 'post',
      url: 'file/upload',
      data:postData,
      responseType: "blob"
   }).then(res => {
      const _res = res.data
      let blob = new Blob([_res], {
            type: 'application/png'
          });
      let downloadElement = document.createElement("a");
      let href = window.URL.createObjectURL(blob); //创建下载的链接
      downloadElement.href = href;
      downloadElement.download = res.headers["fileName"]; //下载后文件名
      document.body.appendChild(downloadElement);
      downloadElement.click(); //点击下载
      document.body.removeChild(downloadElement); //下载完成移除元素
      window.URL.revokeObjectURL(href); //释放掉blob对象
    })}

2.3 中文乱码问题

前后端模式下的文件下载,进程会出现中文乱码问题,我们需要进行修改,并且指定一些格式

后端

func Download(c *gin.Context) {

  filename := url.QueryEscape("国家机密.txt")
  // 可唤起浏览器下载
  c.Header("Content-Disposition", "attachment; filename*=utf-8''"+filename) //
  c.Header("fileName", filename)
  c.File("uploads/国家机密.txt")
}

前端

async download() {
    let res = await axios.get("/download", {headers: {responseType: "blob"}})
    if (res.status === 200) {
        let binaryData = [];
        binaryData.push(res.data);
        let url = window.URL.createObjectURL(new Blob(binaryData)); //表示一个指定的file对象或Blob对象

        let a = document.createElement("a");
        document.body.appendChild(a);

        // 转码文件的标题
        let filename = decodeURI(res.headers.filename)

        // 调起文件下载
        a.href = url;
        a.download = filename; //命名下载名称
        a.click(); //点击触发下载
        window.URL.revokeObjectURL(url);
    }
}

这就是简单的文件上传和下载啦~~文章来源地址https://www.toymoban.com/news/detail-720606.html

到了这里,关于Go学习第十六章——Gin文件上传与下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go学习第十四章——Gin请求与响应

    在Gin中,我们可以使用不同的方法设置请求的响应值,包括String、JSON、HTML和XML等。 1.1 String 使用String方法 返回字符串 类型的响应内容。 当我们访问http://localhost:8080/users时,就能够在浏览器上看到输出了\\\"Users\\\"。 补充:这里的http.StatusOK,是可以修改的,可以直接写200,因为

    2024年02月06日
    浏览(33)
  • Go学习第十七章——Gin中间件与路由

    Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等 即比如,如果访问一个网页的话,不管访问什么路径都需要进行登录,

    2024年02月07日
    浏览(35)
  • Go学习第十五章——Gin参数绑定bind与验证器

    在Gin框架中, bind 用于绑定参数,即将请求参数绑定到结构体中。通过使用 bind ,我们可以方便地将请求参数与结构体字段进行绑定,从而更方便地处理和验证参数。 Gin框架提供了多种绑定方法,包括Query参数绑定、Form参数绑定、JSON参数绑定等。下面分别介绍这些方法的详

    2024年02月07日
    浏览(30)
  • Go学习第十八章——Gin日志与第三方工具Logrus

    1.1 快速入门 在使用Gin框架的过程中,日志是一个重要的组成部分,它可以记录框架和应用程序的运行情况,帮助开发者排查问题和监控应用程序的性能。Gin框架提供了方便的方法来设置和使用日志。 默认日志 Gin框架默认使用的是标准库的log包,将日志输出到控制台。可以通

    2024年02月07日
    浏览(30)
  • 第十六章 Redies

    2024年04月09日
    浏览(29)
  • 第十六章:变量、流程控制与游标

    ​ 在 MySQL 数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或输出最终的结果数据。变量分为 系统变量 和 用户自定义变量 。 系统变量 ​ 变量由系统定义,不是用户定义,输入服务器层面。启动 MySQL 服务,生成 MySQL 服务实例期间, MySQL 将为

    2024年02月08日
    浏览(39)
  • go-gin-vue3-elementPlus带参手动上传文件

    go的mvc层使用gin框架. 总的来说gin的formFile封装的不如springboot的好.获取值有很多的坑. 当然使用axios的formData也有不少坑.现给出较好的解决办法 以下部分仅贴出关键代码 1.1 全局Axios部分样例 axios前后端网络交互 1.2 上传业务 关键代码一览. 需要留意的是,我使用手动上传,elemen

    2024年02月06日
    浏览(29)
  • 第十六章 预制件prefab(上)

    本章节我们介绍一下“预制件”,也有人叫“预制体”,也就是Prefab。在游戏世界中,那些自然环境的游戏对象,我们可以提前创建在场景中,这个大家能够理解。但是,有些游戏对象,需要根据游戏逻辑来通过代码生成,例如刷新怪物,触发机关等等。Unity 的预制件系统允许

    2024年02月02日
    浏览(32)
  • 《TCP IP网络编程》第十六章

              「分离 I/O 流」是一种常用表达。有 I/O 工具可区分二者,无论采用哪种方法,都可以认为是分离了 I/O 流。 2次 I/O 流分离: 第一种是第 10 章的「TCP I/O 过程」分离。通 过调用 fork 函数复制出一个文件描述符,以区分输入和输出中使用的文件描述符。虽然文件描

    2024年02月13日
    浏览(32)
  • 第十六章 Unity 预制件prefab(上)

    本章节我们介绍一下“预制件”,也有人叫“预制体”,也就是Prefab。在游戏世界中,那些自然环境的游戏对象,我们可以提前创建在场景中,这个大家能够理解。但是,有些游戏对象,需要根据游戏逻辑来通过代码生成,例如刷新怪物,触发机关等等。Unity 的预制件系统允许

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包