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”:

Go gin框架控制器接收文件_第1张图片这是随大流的做法,参考: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”或者别的什么都行:

Go gin框架控制器接收文件_第2张图片

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”

你可能感兴趣的:(Go,golang,gin)