Gin(二) 文件上传

文件上传

文件上传接收的文件格式是: 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")
}

Gin(二) 文件上传_第1张图片
Gin(二) 文件上传_第2张图片

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")
}

Gin(二) 文件上传_第3张图片

Gin(二) 文件上传_第4张图片

你可能感兴趣的:(Golang,go,web,gin,文件上传)