Go gin框架控制器接收文件

2024-01-11 11:52
文章标签 go 框架 gin 控制器接收

本文主要是介绍Go gin框架控制器接收文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 限定文件参数名(一般做法)

func FileController(c *gin.Context) {//取表单中name=file的文件fileHeader, err := c.FormFile("file")//_, fileHeader, err := c.Request.FormFile("file")//这种也行if err != nil {log.Println(err)c.JSON(http.StatusOK, gin.H{"msg": "文件接收失败",})return}var savePath = "./tmp/"                                            //文件保存路径err = c.SaveUploadedFile(fileHeader, savePath+fileHeader.Filename) //框架自带保存方法if err != nil {log.Println(err)c.JSON(http.StatusOK, gin.H{"msg": "文件保存失败",})return}log.Println("文件保存成功:", savePath+fileHeader.Filename)c.JSON(http.StatusOK, gin.H{"msg": "SUCCESS",})
}

这种需要跟客户端约定,文件使用表单上传时必须用指定的“name”作为字段名,如此处就用了“file”:

这是随大流的做法,参考:golang学习笔记(18)-gin对于文件的接收以及返回_gin接收文件-CSDN博客

2.不限定文件参数名

func FileController(c *gin.Context) {var filenameSlice []stringvar err errorvar savePath = "./tmp/" //文件保存路径// 通过c.Request.MultipartForm.File获取文件,我这里取的是表单中的所有文件,而不仅仅是名为"file"的文件fileMap := c.Request.MultipartForm.Filefor k, v := range fileMap {fmt.Println("k:", k, "v:", v) //k是表单参数中文件所属的name,v是文件所在内存地址的切片for i, fHeader := range v {filename := savePath + fHeader.Filenameerr = c.SaveUploadedFile(fHeader, filename) //框架自带保存方法if err != nil {log.Println(err)c.JSON(http.StatusOK, gin.H{"msg": "文件保存失败",})return}log.Printf("file[%d]:%s\n", i, fHeader.Filename)filenameSlice = append(filenameSlice, filename)}}if filenameSlice == nil || len(filenameSlice) < 1 {c.JSON(http.StatusOK, gin.H{"msg": "没有收到文件",})return}log.Println("文件保存成功,收到文件数:", len(filenameSlice))log.Printf("the first file[%s]\n", savePath+filenameSlice[0]) //可以取需要的任意一个文件c.JSON(http.StatusOK, gin.H{"msg": "SUCCESS",})
}

这种可以收取客户端传来的所有文件,不管是“name=file”还是“name=file1”或者别的什么都行:

3.顺带还接收其他表单参数

func FileController(c *gin.Context) {log.Println("接收到的参数: name=", c.Request.FormValue("name"), ", age=", c.Request.FormValue("age"))var filenameSlice []stringvar err errorvar savePath = "./tmp/" //文件保存路径// 通过c.Request.MultipartForm.File获取文件,我这里取的是表单中的所有文件,而不仅仅是名为"file"的文件fileMap := c.Request.MultipartForm.Filefor k, v := range fileMap {fmt.Println("k:", k, "v:", v) //k是表单参数中文件所属的name,v是文件所在内存地址的切片for i, fHeader := range v {filename := savePath + fHeader.Filenameerr = c.SaveUploadedFile(fHeader, filename) //框架自带保存方法if err != nil {log.Println(err)c.JSON(http.StatusOK, gin.H{"msg": "文件保存失败",})return}log.Printf("file[%d]:%s\n", i, fHeader.Filename)filenameSlice = append(filenameSlice, filename)}}if filenameSlice == nil || len(filenameSlice) < 1 {c.JSON(http.StatusOK, gin.H{"msg": "没有收到文件",})return}log.Println("文件保存成功,收到文件数:", len(filenameSlice))log.Printf("the first file[%s]\n", savePath+filenameSlice[0]) //可以取需要的任意一个文件c.JSON(http.StatusOK, gin.H{"msg": "SUCCESS",})
}

客户端在上传文件的同时还可携带其他数据,示例图同“2”

这篇关于Go gin框架控制器接收文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/594275

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(