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博客
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”或者别的什么都行:
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”