Go语言实战 您所在的位置:网站首页 gin上传大文件 Go语言实战

Go语言实战

2023-10-28 18:49| 来源: 网络整理| 查看: 265

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

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代码



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有