文件上传
文件上传接收的文件格式是: multipart/form-data
- 处理multipart forms提交文件时默认的内存限制是32 MB
// gin.go
const defaultMultipartMemory = 32 << 20 // 32 MB
- 可以通过下面的方式修改
router.MaxMultipartMemory = 8 << 20 // 8 MB
1. 单个文件上传
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
/*
单个文件上传
文件上传接收的文件格式是: multipart/form-data
*/
// singleFileUploadHandle 当文件上传
func singleFileUploadHandle(ctx *gin.Context) {
// 获取文件
// 根据上传时的参数名获取上传的文件内容 --> 返回对象为 *multipart.FileHeader
fileHeader, err := ctx.FormFile("file")
if err != nil {
ctx.JSON(http.StatusInternalServerError,gin.H{
"message": err.Error(),
})
return
}
// 保存文件内容
// 拼接文件名, 这里直接写死了
targetFileName := fmt.Sprintf("D:/gin_upload_test/%s", fileHeader.Filename)
// 将文件保存到指定的目录
err = ctx.SaveUploadedFile(fileHeader,targetFileName)
if err != nil {
ctx.JSON(http.StatusInternalServerError,gin.H{
"message": err.Error(),
})
} else {
ctx.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("%s upload success!", fileHeader.Filename),
})
}
}
func main() {
// 创建路由
r := gin.Default()
// 绑定路由规则
r.POST("/upload/single", singleFileUploadHandle)
// 监听端口
r.Run(":9000")
}
2. 多文件上传
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
/**
多文件上传
*/
// multiFileUploadHandle 多文件上传
func multiFileUploadHandle(ctx *gin.Context) {
// form 是一个存储文件信息的结构体
/**
type Form struct {
Value map[string][]string
File map[string][]*FileHeader
*/
form, err := ctx.MultipartForm()
if err != nil {
ctx.JSON(http.StatusInternalServerError,gin.H{
"message": err.Error(),
})
return
}
// 获取文件列表,并保存, 返回的是一个切片 []*FileHeader
files := form.File["file"]
for i, file := range files {
targetFileName := fmt.Sprintf("D:/gin_upload_test/%d_%s", i, file.Filename)
err = ctx.SaveUploadedFile(file, targetFileName)
if err != nil {
ctx.JSON(http.StatusInternalServerError,gin.H{
"message": err.Error(),
})
return
}
}
ctx.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("upload success!"),
})
}
func main() {
// 创建路由
r := gin.Default()
// 绑定路由规则
r.POST("/upload/multi", multiFileUploadHandle)
// 监听端口
r.Run(":9000")
}