上传到文件到七牛云的两种上传方式:
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
}