Go语言实战-通过gin上传文件到七牛云OSS

上传到文件到七牛云的两种上传方式:

1. 客户端上传到服务器,服务器再上传到七牛云

2.客户端直接通过ajax上传到七牛云

前者:需要上传到服务器,这个过程需要消耗不少带宽,也给服务器带来不小压力,但起码这种方式可控,且不用暴露upToken在客户端,避免被滥用;

后者:不需要上传到服务器,从服务端获取upToken后,直接在客户端就可以上传文件到七牛云,这种方式相比前者对服务器没多大压力,但是客户端拿到upToken后就可以往七牛云上传,可控力度很小,云上容易产生垃圾资源。

这两种方式各有优缺点,需要在上传可控和服务器压力之间做权衡,根据自身业务场景选择较为合适自己的就行,下面通过gin上传文件实操下第一种方式。

首先要在七牛云创建有对象存储空间,不了解的戳这

根据自己创建的空间设置好这几个参数

var AccessKey = "yourAccessKey" // 秘钥对
var SerectKey = "yourSerectKey"
var Bucket = "yourBucket"              // 空间名称
var ImgUrl = "http://your.domain.com/" // 自定义域名或测试域名

以表单方式上传文件,可以自定义key,可以指定上传目录及文件名和后缀

// 上传 自定义key,可以指定上传目录及文件名和后缀,
key := "image/" + file.Filename // 上传路径,如果当前目录中已存在相同文件,则返回上传失败错误
err = formUploader.Put(context.Background(), &ret, upToken, key, src, file.Size, &putExtra)

使用默认key的话,上传的文件将没有后缀

// 以默认key方式上传
err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, src, fileSize, &putExtra)

 

以本地路径方式上传

// 自定义key,上传指定路径的文件
localFilePath = "upload/aa.jpg"
err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)

完整代码

package main

import (
	"context"
	"mime/multipart"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
)

func main() {

	r := gin.Default()

	r.LoadHTMLGlob("view/index.html")

	// index页面显示
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	// 表单提交
	r.POST("/uploadfile", func(c *gin.Context) {

		f, err := c.FormFile("f1")
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"code": 10010,
				"msg":  err.Error(),
			})
			return
		}

		// 上传到七牛云
		code, url := UploadToQiNiu(f)

		c.JSON(http.StatusOK, gin.H{
			"code": code,
			"msg":  "OK",
			"url":  url,
		})

	})
	// 运行,监听127.0.0.1:8080
	r.Run()
}

// 上传图片到七牛云,然后返回状态和图片的url
func UploadToQiNiu(file *multipart.FileHeader) (int, string) {

	var AccessKey = "yourAccessKey" // 秘钥对
	var SerectKey = "yourSerectKey"
	var Bucket = "yourBucket"              // 空间名称
	var ImgUrl = "http://your.domain.com/" // 自定义域名或测试域名

	src, err := file.Open()
	if err != nil {
		return 10011, err.Error()
	}
	defer src.Close()

	putPlicy := storage.PutPolicy{
		Scope: Bucket,
	}
	mac := qbox.NewMac(AccessKey, SerectKey)

	// 获取上传凭证
	upToken := putPlicy.UploadToken(mac)

	// 配置参数
	cfg := storage.Config{
		Zone:          &storage.ZoneHuanan, // 华南区
		UseCdnDomains: false,
		UseHTTPS:      false, // 非https
	}
	formUploader := storage.NewFormUploader(&cfg)

	ret := storage.PutRet{}        // 上传后返回的结果
	putExtra := storage.PutExtra{} // 额外参数

	// 上传 自定义key,可以指定上传目录及文件名和后缀,
	key := "image/" + file.Filename // 上传路径,如果当前目录中已存在相同文件,则返回上传失败错误
	err = formUploader.Put(context.Background(), &ret, upToken, key, src, file.Size, &putExtra)

	// 以默认key方式上传
	// err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, src, fileSize, &putExtra)

	// 自定义key,上传指定路径的文件
	// localFilePath = "./aa.jpg"
	// err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)

	// 默认key,上传指定路径的文件
	// localFilePath = "./aa.jpg"
	// err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)

	if err != nil {
		code := 501
		return code, err.Error()
	}

	url := ImgUrl + ret.Key // 返回上传后的文件访问路径
	return 0, url
}

demo代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值