gin 上传图片到阿里云oss

53 min read

上传函数

import (
  "io"
	"Festival/app/common/cfg"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func OssUpload(key string, file io.Reader) (string, error) {
	ossCfg := cfg.Instance().Oss

	client, err := oss.New(ossCfg.Endpoint, ossCfg.AccessKeyId, ossCfg.AccessKeySecret)
  if err != nil {
    return "", err
  }
  // 获取存储空间。
  bucket, err := client.Bucket(ossCfg.BucketName)
  if err != nil {
    return "", err
  }
  // 上传文件。
  err = bucket.PutObject(key, file)
  if err != nil {
    return "", err
  }
  // https://jxcatimg.oss-cn-shenzhen.aliyuncs.com/articles/202107/1626401559-1564453109_219427.jpg
	return ossCfg.Bucketpoint + "/" + key, nil
} 

上传

import (
	"app/common/utils/oss"
	"fmt"
	"github.com/gin-gonic/gin"
	"os"
	"path/filepath"
	"time"
)

func OSSUploadFile(c *gin.Context) {
	fileHeader, err := c.FormFile("file")
	if err != nil {
		response.ErrorResp(c).SetMsg("参数有误").ToJson()
		return
	}
	fileExt := filepath.Ext(fileHeader.Filename)
	allowExts := []string {".jpg", ".png", ".gif", ".jpeg", ".doc", ".docx", ".ppt", ".pptx", ".xls", ".xlsx", ".pdf"}
	allowFlag := false
	for _, ext := range allowExts {
		if ext == fileExt {
			allowFlag = true
			break
		}
	}
	if (!allowFlag) {
		response.ErrorResp(c).SetMsg("不允许的类型").ToJson()
		return
	}

	now := time.Now()
	//文件存放路径
	fileDir := fmt.Sprintf("articles/%s", now.Format("200601"))
	
	//文件名称
	timeStamp := now.Unix()
	fileName := fmt.Sprintf("%d-%s", timeStamp, fileHeader.Filename)
	// 文件key
	fileKey := filepath.Join(fileDir, fileName)

	src, err := fileHeader.Open()
	if err != nil {
		response.ErrorResp(c).SetMsg("上传失败").ToJson()
		return
	}
	defer src.Close()

	res, err := oss.OssUpload(fileKey, src)
	if err != nil {
		response.ErrorResp(c).SetMsg("上传失败").ToJson()
		return
	}
	
	response.SucessResp(c).SetData(request.UploadFile{Title: fileName, Src: res}).ToJson()
}