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

目录
相关文章
|
Shell 开发工具 git
从本地到Gitee:一步步学习文件上传及解决常见报错问题
从本地到Gitee:一步步学习文件上传及解决常见报错问题
602 0
|
存储 JavaScript BI
GitHub:GitHub简介、使用方法、经验总结(图文教程)之详细攻略(持续更新!)
GitHub:GitHub简介、使用方法、经验总结(图文教程)之详细攻略(持续更新!)
|
2月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
582 1
|
7月前
|
前端开发
Github项目分享——免费的画图工具drow,最新前端面试题整理
Github项目分享——免费的画图工具drow,最新前端面试题整理
|
7月前
|
JavaScript Java 数据安全/隐私保护
我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档
大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架、软件或者教程。这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整理下来的想法。觉得不错的话,欢迎小伙伴们去star一波。
|
7月前
|
移动开发 前端开发 IDE
前端知识笔记(三十四)———HBuilder的下载与使用(详细步骤)
前端知识笔记(三十四)———HBuilder的下载与使用(详细步骤)
221 0
|
7月前
|
前端开发 IDE JavaScript
【源码共读之omit.js】如何在线使用github
【源码共读之omit.js】如何在线使用github
149 0
|
存储 前端开发 程序员
Day05:Gin框架快速入门04 文件上传和下载| 青训营
Day05:Gin框架快速入门04 文件上传和下载| 青训营
|
数据采集 JSON JavaScript
Puppeteer 实战教程 - 爬取 Github 高星项目数据
本文通过爬取 Github 高星数据项目讲解了 Puppeteer 的入门知识,包括浏览器启动、页面访问、页面数据提取、页面交互等,利用这些知识你可以用 Puppeteer 自动化你的日常工作。
400 0
|
JSON 缓存 程序员
Day04:Gin框架快速入门02 请求| 青训营
Day04:Gin框架快速入门02 请求| 青训营