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

目录
相关文章
|
存储 JavaScript BI
GitHub:GitHub简介、使用方法、经验总结(图文教程)之详细攻略(持续更新!)
GitHub:GitHub简介、使用方法、经验总结(图文教程)之详细攻略(持续更新!)
|
2天前
|
JavaScript Java 数据安全/隐私保护
我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档
大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架、软件或者教程。这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整理下来的想法。觉得不错的话,欢迎小伙伴们去star一波。
|
2天前
|
前端开发 IDE JavaScript
【源码共读之omit.js】如何在线使用github
【源码共读之omit.js】如何在线使用github
75 0
|
9月前
|
存储 前端开发 程序员
Day05:Gin框架快速入门04 文件上传和下载| 青训营
Day05:Gin框架快速入门04 文件上传和下载| 青训营
253 0
|
9月前
|
数据采集 人工智能 缓存
GitHub图片加载不出来解决方案(超详细图文教程)
GitHub图片加载不出来解决方案(超详细图文教程)
1426 0
|
9月前
|
数据采集 JSON JavaScript
Puppeteer 实战教程 - 爬取 Github 高星项目数据
本文通过爬取 Github 高星数据项目讲解了 Puppeteer 的入门知识,包括浏览器启动、页面访问、页面数据提取、页面交互等,利用这些知识你可以用 Puppeteer 自动化你的日常工作。
241 0
|
算法
字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
1997 0
字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
|
存储 移动开发 前端开发
利用gitee搭建pdf在线阅读功能
利用gitee搭建pdf在线阅读功能
利用gitee搭建pdf在线阅读功能
|
程序员 开发工具 数据安全/隐私保护
GitHub使用方法(扫盲)
GitHub使用方法(扫盲)
208 0
GitHub使用方法(扫盲)
|
敏捷开发 存储 Java
手把手教你如何巧用Github的Action功能
手把手教你如何巧用Github的Action功能
983 0
手把手教你如何巧用Github的Action功能