赞
踩
1. 客户端上传到服务器,服务器再上传到七牛云
2.客户端直接通过ajax上传到七牛云
前者:需要上传到服务器,这个过程需要消耗不少带宽,也给服务器带来不小压力,但起码这种方式可控,且不用暴露upToken在客户端,避免被滥用;
后者:不需要上传到服务器,从服务端获取upToken后,直接在客户端就可以上传文件到七牛云,这种方式相比前者对服务器没多大压力,但是客户端拿到upToken后就可以往七牛云上传,可控力度很小,云上容易产生垃圾资源。
这两种方式各有优缺点,需要在上传可控和服务器压力之间做权衡,根据自身业务场景选择较为合适自己的就行,下面通过gin上传文件实操下第一种方式。
- var AccessKey = "yourAccessKey" // 秘钥对
- var SerectKey = "yourSerectKey"
- var Bucket = "yourBucket" // 空间名称
- var ImgUrl = "http://your.domain.com/" // 自定义域名或测试域名
- // 上传 自定义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
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。