先根据官方文档,编写一个实现接收文件方法
func main() {
r := gin.Default()
r.POST("/testLoad", func(c *gin.Context) {
file, _ := c.FormFile("file")
c.SaveUploadedFile(file, "./tmp/"+file.Filename)
c.JSON(200, gin.H{
"msg": file,
})
})
r.Run()
}
FormFile方法用于获取表单信息中file格式的参数。并且返回一个文件流。
SaveUploadedFile方法提供两个参数。参数1为指定需要保存操作的文件,参数2为指定保存路径。
其函数构造为
func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error {
src, err := file.Open()
if err != nil {
return err
}
defer src.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, src)
return err
}
函数首先打开目标文件的文件流,后再本地dst路径下创建一个文件流,然后运用io操作经行复制,最后关闭本地与目标文件流。
实验SaveUpLoaded方法
func main() {
r := gin.Default()
r.POST("/testLoad", func(c *gin.Context) {
file, _ := c.FormFile("file")
dst := "./tmp/" + file.Filename
src, _ := file.Open()
defer src.Close()
out, _ := os.Create(dst)
defer out.Close()
io.Copy(out, src)
c.JSON(200, gin.H{
"msg": file,
})
})
r.Run()
}
file.close 用于关闭已经打开的文件,停止读写功能,防止出现错误。
利用File方法进行实现给前端返回文件的功能
func main() {
r := gin.Default()
r.POST("/testLoad", func(c *gin.Context) {
c.File("./tmp/" + "报名照片.jpg")
})
r.Run()
}
其中File的方法构造为
func (c *Context) File(filepath string) {
http.ServeFile(c.Writer, c.Request, filepath)
}
ServeFile用指定的文件或目录的内容来回复请求。
当form表单中多个同名文件一起上传时,只会存储靠前的文件,例如:
func main() {
r := gin.Default()
r.POST("/testLoad", func(c *gin.Context) {
form, _ := c.MultipartForm()
files := form.File["file"]
for _, file := range files {
c.SaveUploadedFile(file, "./tmp/"+file.Filename)
}
})
r.Run()
}
MultipartForm是经过解析的多部分表格,包括文件上传返回一个Form结构体。
只下载了name为file的文件。
个人理解为在创建储存容器后,将form表单内信息储存在Form结构体中的map结构中,在调用时,map中的key为form表单上的name值。再遍历经行单文件操作。