Gin框架 :文件上传
上传单个文件:
上传文件用POST方法,之前提到过的multipart/form-data编码格式,就是用于上传文件的,gin把go原生的request封装到了c.Request中
package main import ( "github.com/gin-gonic/gin" "fmt" "net/http" "os" "log" "io" ) func uploadFile(c *gin.Context) { // FormFile方法会读取参数“upload”后面的文件名,返回值是一个File指针,和一个FileHeader指针,和一个err错误。 file, header, err := c.Request.FormFile("upload") if err != nil { c.String(http.StatusBadRequest, "Bad request") return } // header调用Filename方法,就可以得到文件名 filename := header.Filename fmt.Println(file, err, filename) // 创建一个文件,文件名为filename,这里的返回值out也是一个File指针 out, err := os.Create(filename) if err != nil { log.Fatal(err) } defer out.Close() // 将file的内容拷贝到out _, err = io.Copy(out, file) if err != nil { log.Fatal(err) } c.String(http.StatusCreated, "upload successful \n") } func main() { router := gin.Default() // 调用POST方法,传入路由参数和路由函数 router.POST("/upload", uploadFile) // 监听端口8000,注意冒号。 router.Run(":8000") }
在终端输入
curl -X POST http://127.0.0.1:8000/upload -F "upload=@/Users/Peter/Pictures/avatar.jpg" -H "Content-Type: multipart/form-data"
上传多个文件:
模拟上传多个文件,与上传单个文件区别不大,只是用MultipartForm
方法替代了FormFile
方法,而MultipartForm
方法的返回值是一个数组,数组元素为file
,所以只需要遍历一下这个数组,并取出文件名,再进行拷贝即可。
package main import ( "github.com/gin-gonic/gin" "log" "os" "io" "net/http" "fmt" ) func upldFiles(c *gin.Context) { err := c.Request.ParseMultipartForm(200000) if err != nil { log.Fatal(err) } // 获取表单 form := c.Request.MultipartForm // 获取参数upload后面的多个文件名,存放到数组files里面, files := form.File["upload"] // 遍历数组,每取出一个file就拷贝一次 for i, _ := range files { file, err := files[i].Open() defer file.Close() if err != nil { log.Fatal(err) } fileName := files[i].Filename fmt.Println(fileName) out, err := os.Create(fileName) defer out.Close() if err != nil { log.Fatal(err) } _, err = io.Copy(out, file) if err != nil { log.Fatal(err) } c.String(http.StatusCreated, "uploadFiles success! \n") } } func main() { router := gin.Default() router.POST("/upload", upldFiles) router.Run(":8088") }
在终端输入:
curl -X POST http://127.0.0.1:8088/upload -F "upload=@/Users/Peter/Pictures/avatar.jpg" -F "upload=@/Users/Peter/Pictures/爬虫.jpg" -H "Content-Type: multipart/form-data"