gin框架学习-文件上传

简介: 多文件上传就是一次可以上传多个文件,不需要一个文件一个文件上传,这也便于上传文件的人。

前言


感谢开源项目gin-vue-admin,以及1010工作室的视频教程

本人学识尚浅,如有错误,请评论指出,谢谢!

详细可见个人博客:https://linzyblog.netlify.app/

一、单文件上传


  • multipart/form-data格式用于文件上传,gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中。


func main() {
  r := gin.Default()
  r.POST("/FileTest", func(c *gin.Context) {
    //FormFile返回所提供的表单键的第一个文件
    f, _ := c.FormFile("file")
    //SaveUploadedFile上传表单文件到指定的路径
    c.SaveUploadedFile(f, "./"+f.Filename)
    c.JSON(200, gin.H{
      "msg": f,
    })
  })
  r.Run(":8080")
}


打开postman选择POST请求,选择Body里的form-data上传文件,访问http://localhost:8080/FileTest


3359817211114ae5bcae15c3ac2e22bd.png


我们可以看到请求返回的文件包含了文件名和他的头映射。


957ab44c7e9240d6bb13bbaf7f99ea3f.png


  • 我们来了解FormFile的方法实现


func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error {
  //打开请求发送的文件
  src, err := file.Open()
  if err != nil {
    return err
  }
  defer src.Close()
  //在本地创建一个文件
  out, err := os.Create(dst)
  if err != nil {
    return err
  }
  defer out.Close()
  //把内容拷贝到本地文件
  _, err = io.Copy(out, src)
  return err
}


  • 如果我们想给前端返回文件怎么办?


//添加头部映射内容
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", f.Filename))
//File以有效的方式将指定文件写入主体流。
c.File("./" + f.Filename)


c5eff3752e894a97949ff977f6fcbbd0.png


fb06bc491dc64e45ba9f5863d55d63ac.png


大功告成,我们成功的将文件内容发送给前端。


二、多文件上传


多文件上传就是一次可以上传多个文件,不需要一个文件一个文件上传,这也便于上传文件的人。


获取多文件的MultipartForm方法


1.MultipartForm:MultipartForm是经过解析的多部分表单(表单里面只有两个属性Value和File),包括文件上传。


2.File: File部分存储在内存或磁盘上,可通过*FileHeader的Open方法访问。


3.Value: Value部分存储为字符串。


两者都通过map的字段名进行键控。


func main() {
  //多文件上传
  r := gin.Default()
  r.POST("/multFile", func(c *gin.Context) {
    form, err := c.MultipartForm()
    if err != nil {
      log.Fatal(err)
    }
    //通过字段名映射
    f := form.File["file"]
    //for range遍历文件
    for _, file := range f {
      fmt.Println(file.Filename)
      c.SaveUploadedFile(file, "./"+file.Filename)
      c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s"+file.Filename))
      c.File("./" + file.Filename)
    }
  })
  r.Run(":8080")
}


打开postman选择POST请求,选择Body里的form-data上传多个文件,访问http://localhost:8080/multFile


fe27471783df4211a348b564daf64404.png

53c518820b9948caa74afbc1c649e353.png


我们成功将两个文件接收并保存下来,并返回给前端了第一个文件。

目录
相关文章
|
安全 Go 开发者
你真的懂 close(chan) 吗?90% 的 Go 开发者都掉过这个坑!
在 Go 并发编程中,初始化 channel 后直接 `close` 是合法且常见做法,用于广播通知、表示任务完成或作为退出信号。相比发送数据,关闭通道能非阻塞地通知多个 goroutine,更安全高效。理解这一机制有助于构建稳定、优雅的并发系统。
407 0
|
关系型数据库 MySQL Linux
Linux 下安装mysql 出现libncurses.so.5 is needed by MySQL-client-5.6.22-1.el6.i686解决办法
输入命令 : yum install libncurses.so.5。原因是因为缺少 : libncurses.so.5。
2248 0
|
监控 Ubuntu 测试技术
Ubuntu 20.04 安装部署 TiDB DM v7.3.0 集群【全网独家】
在Ubuntu上搭建TiDB DM集群的详细步骤分享,作者因工作需求克服了部署难题。测试环境包括3台Ubuntu 20.04主机:1台master和2台worker。首先,确保所有主机安装TiDB单机环境,使用TiUP工具下载并部署。接着,设置主机间免密登录,安装必要组件如sudo、systemd、iproute2和DM组件。配置文件可通过在线或离线方式获取。部署时,根据需求编辑`topology.yaml`,然后使用`tiup dm deploy`命令安装。最后,启动集群并检查节点状态,确认DM集群正常运行。注意,解决内存不足和端口连通性问题以避免错误。
1234 3
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
912 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
Go使用命令行输出二维码
Go使用命令行输出二维码
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
1215 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
8632 0
|
安全 JavaScript 前端开发
跨域问题如何解决
跨域问题是指浏览器同源策略限制了不同域名之间的资源访问。解决方法包括:1. CORS(跨域资源共享):服务器设置Access-Control-Allow-Origin响应头;2. JSONP:利用script标签不受同源策略限制的特点;3. 代理服务器:通过后端代理转发请求。
|
JavaScript
Vue3倒计时(Countdown)
这篇文章介绍了如何在Vue 3中创建一个可自定义的倒计时组件(Countdown),允许设置标题、前缀、后缀、格式和样式,并提供了组件的实现代码和使用示例。
1504 2
Vue3倒计时(Countdown)
|
JavaScript
VUE element-ui之table表格全局排序、调用后端接口排序功能
VUE element-ui之table表格全局排序、调用后端接口排序功能
2615 0

热门文章

最新文章