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"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-05-23 区块链钱包开发
2021-05-23 区块链基础概念-coins和tokens