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 []string
	var err error
	var savePath = "./tmp/" //文件保存路径
	// 通过c.Request.MultipartForm.File获取文件,我这里取的是表单中的所有文件,而不仅仅是名为"file"的文件
	fileMap := c.Request.MultipartForm.File
	for k, v := range fileMap {
		fmt.Println("k:", k, "v:", v) //k是表单参数中文件所属的name,v是文件所在内存地址的切片
		for i, fHeader := range v {
			filename := savePath + fHeader.Filename
			err = 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 []string
	var err error
	var savePath = "./tmp/" //文件保存路径
	// 通过c.Request.MultipartForm.File获取文件,我这里取的是表单中的所有文件,而不仅仅是名为"file"的文件
	fileMap := c.Request.MultipartForm.File
	for k, v := range fileMap {
		fmt.Println("k:", k, "v:", v) //k是表单参数中文件所属的name,v是文件所在内存地址的切片
		for i, fHeader := range v {
			filename := savePath + fHeader.Filename
			err = 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”

相关推荐

  1. 接收文件文件上传)

    2024-01-13 01:58:02       32 阅读
  2. Shiro框架权限控制

    2024-01-13 01:58:02       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 01:58:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 01:58:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 01:58:02       87 阅读
  4. Python语言-面向对象

    2024-01-13 01:58:02       96 阅读

热门阅读

  1. 如何解决TCP拥塞问题?

    2024-01-13 01:58:02       62 阅读
  2. LeetCode878. Nth Magical Number

    2024-01-13 01:58:02       53 阅读
  3. vue3中el-table实现表格合计行

    2024-01-13 01:58:02       66 阅读
  4. [ECE]1.3 Basic logic operations

    2024-01-13 01:58:02       48 阅读
  5. 3 微信小程序

    2024-01-13 01:58:02       51 阅读
  6. 面试题-回溯算法解法模板

    2024-01-13 01:58:02       55 阅读
  7. 数据库面经---10则

    2024-01-13 01:58:02       61 阅读
  8. Android实现通过字符串找到图片、Class

    2024-01-13 01:58:02       49 阅读
  9. [ECE] Introduction to Digital Logic and Systems

    2024-01-13 01:58:02       52 阅读