Gin文件上传与下载 | 青训营笔记

简介: Gin文件上传与下载 | 青训营笔记

前言

Gin是用Go编写的web框架。性能还不错,而且使用比较简单,还支持RESTful API。

日常的使用中我们可能要处理一些文件的上传与下载,我这里简单总结一下。

单文件上传

我们使用multipart/form-data格式上传文件,利用c.Request.FormFile解析文件。

// HandleUploadFile 上传单个文件
func HandleUploadFile(c *gin.Context) {
  file, header, err := c.Request.FormFile("file")
  if err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"msg": "文件上传失败"})
    return
  }
  content, err := ioutil.ReadAll(file)
  if err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"msg": "文件读取失败"})
    return
  }
  fmt.Println(header.Filename)
  fmt.Println(string(content))
  c.JSON(http.StatusOK, gin.H{"msg": "上传成功"})
}

我们上传文件可以看到。

image.png

我们已经看到文件上传成功,已经文件名字与内容。

多文件上传

多文件的上传利用c.Request.MultipartForm解析。

// HandleUploadMutiFile 上传多个文件
func HandleUploadMutiFile(c *gin.Context) {
  // 限制放入内存的文件大小
  err := c.Request.ParseMultipartForm(4 << 20)  // 4Mb
  if err != nil {
    c.JSON(http.StatusBadRequest, gin.H{"msg": "文件太大"})
    return
  }
  formdata := c.Request.MultipartForm
  files := formdata.File["file"]
  for _, v := range files {
    file, err := v.Open()
    if err != nil {
      c.JSON(http.StatusBadRequest, gin.H{"msg": "文件读取失败"})
      return
    }
    defer file.Close()
    content, err := ioutil.ReadAll(file)
    if err != nil {
      c.JSON(http.StatusBadRequest, gin.H{"msg": "文件读取失败"})
      return
    }
    fmt.Println(v.Filename)
    fmt.Println(string(content))
  }
  c.JSON(http.StatusOK, gin.H{"msg": "上传成功"})
}

多个文件,遍历文件内容即可读取。

利用c.Request.ParseMultipartForm()可设置上传文件的大小,这里限制了4Mb。c.Request.ParseMultipartForm()并不能限制上传文件的大小,只是限制了上传的文件读取到内存部分的大小,如果超过了就存入了系统的临时文件中。 如果需要限制文件大小,需要使用github.com/gin-contrib/size中间件,如demo中使用r.Use(limits.RequestSizeLimiter(4 << 20))限制最大4Mb。

我们看到

image.png

两个文件已经上传成功。

文件下载

文件的下载主要是注意设置文件名,文件类型等。

// HandleDownloadFile 下载文件
func HandleDownloadFile(c *gin.Context) {
  content := c.Query("content")
  content = "hello world, 我是一个文件," + content
  c.Writer.WriteHeader(http.StatusOK)
  c.Header("Content-Disposition", "attachment; filename=hello.txt")
  c.Header("Content-Type", "application/text/plain")
  c.Header("Accept-Length", fmt.Sprintf("%d", len(content)))
  c.Writer.Write([]byte(content))
}

通过

  • Content-Disposition设置文件名字;
  • Content-Type设置文件类型,可以到这里查阅;
  • Accept-Length这个设置文件长度;
  • c.Writer.Write写出文件。

成功下载可以看到:

image.png

目录
打赏
0
0
0
0
8
分享
相关文章
Go开发者必读:Gin框架的实战技巧与最佳实践
在当今快速发展的互联网时代,Web开发的需求日益增长。Go语言以其简洁、高效、并发性强的特点,成为了开发者们的首选。而在Go语言的众多Web框架中,Gin无疑是其中的佼佼者。本文将深入探讨Gin框架的特性、优势以及如何利用Gin构建高性能的Web应用。
Debian 官方源换为国内的源的操作方法
apt-get update 报错,采用更换源的方式解决问题。
53396 0
|
8月前
|
go语言在 switch 语句中使用 break
go语言在 switch 语句中使用 break
242 5
【Golang】如何声明弃用(Deprecated)
【Golang】如何声明弃用(Deprecated)
1932 5
|
12月前
|
influxdb 中得 fields 与 tag 区别总结
influxdb 中得 fields 与 tag 区别总结
885 1
Windows Server 2022 21H2 本地域权限提升漏洞(PetitPotam)
Windows Server 2022 Standard/Datacenter 存在本地域权限提升漏洞,攻击者可通过使用PetitPotam工具进行获取服务器SYSTEM权限。
687 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问