5-Gin上传文件

一 上传文件

1.1 上传单个文件

  • multipart/form-data格式用于文件上传
  • gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	//限制上传最大尺寸 8 M,默认:gin.defaultMultipartMemory,32M
  // 8*2的20次方:8388608b也就是8M
	r.MaxMultipartMemory = 8 << 20
	r.POST("/upload", func(c *gin.Context) {
		file, err := c.FormFile("file")
		if err != nil {
			c.String(500, "上传图片出错")
		}
    // 上传文件到指定的目录,在项目根路径下创建/media/upload文件夹
		dst := path.Join("./media/upload", file.Filename)
		fmt.Println(dst)
		c.SaveUploadedFile(file,dst)
		c.String(http.StatusOK, file.Filename)
	})
	r.Run()
}

1.2 上传多个文件之不同名

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"path"
)

func main() {
	router := gin.Default()

	router.MaxMultipartMemory = 8 << 20
	router.POST("/upload", func(c *gin.Context) {
		file1, _ := c.FormFile("file1")
		file2, _ := c.FormFile("file2")
		dst1 := path.Join("./media/upload", file1.Filename)
		c.SaveUploadedFile(file1,dst1)

		dst2 := path.Join("./media/upload", file2.Filename)
		c.SaveUploadedFile(file2,dst2)
		c.String(http.StatusOK, "文件上传成功")
	})
	router.Run(":8000")
}

1.3 上传多个文件之同名

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"path"
)

func main() {
	router := gin.Default()

	router.MaxMultipartMemory = 8 << 20
	router.POST("/upload", func(c *gin.Context) {
		form, err := c.MultipartForm()
		if err != nil {
			c.String(http.StatusBadRequest, fmt.Sprintf("get err %s", err.Error()))
		}
		// 获取所有图片
		files := form.File["files"]
		// 遍历所有图片
		for _, file := range files {
			// 上传文件至指定目录
			dst := path.Join("./media/upload", file.Filename)
			if err := c.SaveUploadedFile(file, dst); err != nil {
				c.String(http.StatusBadRequest, fmt.Sprintf("上传失败 %s", err.Error()))
				return
			}
		}
		c.String(200, fmt.Sprintf("上传 %d 个文件", len(files)))
	})
	router.Run(":8000")
}

1.4 上传多个图片-按照归档存储

package main

import (
	"fmt"
	"gin_test/utils"
	"github.com/gin-gonic/gin"
	"log"
	"os"
	"path"
	"strconv"
)

func main() {
	router := gin.Default()

	router.MaxMultipartMemory = 8 << 20
	router.POST("/upload", func(c *gin.Context) {
		file, _ := c.FormFile("file")
		//2、获取后缀名 判断类型是否正确 .jpg .png .gif .jpeg .md
		extName := path.Ext(file.Filename) //获取后缀名
		allowExtMap := map[string]bool{
			".jpg":  true,
			".png":  true,
			".gif":  true,
			".jpeg": true,
			".md": true,
		}

		if _, ok := allowExtMap[extName]; !ok {
			c.String(200, "文件类型不合法")
			return
		}
		//3、创建图片保存目录 static/upload/20200623
		day := utils.GetDay()
		dir := "./media/" + day
		if err := os.MkdirAll(dir, 0777); err != nil {
			log.Println(err)
		}
		//4、生成文件名称 1649450399.md
		fileUnixName := strconv.FormatInt(utils.GetUnix(), 10)
		saveDir := path.Join(dir, fileUnixName+extName) // media/upload/20220409/1649450399.md
		fmt.Println(saveDir)
		c.SaveUploadedFile(file, saveDir)
		c.String(200, "上传文件成功")
	})
	router.Run(":8000")
}

utils/common.go

package utils

import (
	"crypto/md5"
	"fmt"
	"time"
)

//时间戳间戳转换成日期
func UnixToDate(timestamp int) string {
	t := time.Unix(int64(timestamp), 0)
	return t.Format("2006-01-02 15:04:05")
}

//日期转换成时间戳 2006-01-02 15:04:05
func DateToUnix(str string) int64 {
	template := "2006-01-02 15:04:05"
	t, err := time.ParseInLocation(template, str, time.Local)
	if err != nil {
		return 0
	}
	return t.Unix()
}
func GetUnix() int64 {
	return time.Now().Unix()
}
func GetDate() string {
	template := "2006-01-02 15:04:05"
	return time.Now().Format(template)
}
func GetDay() string {
	template := "20060102"
	return time.Now().Format(template)
}
func Md5(str string) string {
	data := []byte(str)
	return fmt.Sprintf("%x\n", md5.Sum(data))
}


Mac,linux平台下注意权限,先编译,sudo运行,文件夹才能顺利创建

posted @ 2022-04-09 22:48  刘清政  阅读(542)  评论(0编辑  收藏  举报