当前位置:   article > 正文

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

go上传七牛云

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

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

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

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

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

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

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

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

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

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

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

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

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

 

以本地路径方式上传

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

完整代码

  1. package main
  2. import (
  3. "context"
  4. "mime/multipart"
  5. "net/http"
  6. "github.com/gin-gonic/gin"
  7. "github.com/qiniu/go-sdk/v7/auth/qbox"
  8. "github.com/qiniu/go-sdk/v7/storage"
  9. )
  10. func main() {
  11. r := gin.Default()
  12. r.LoadHTMLGlob("view/index.html")
  13. // index页面显示
  14. r.GET("/index", func(c *gin.Context) {
  15. c.HTML(http.StatusOK, "index.html", nil)
  16. })
  17. // 表单提交
  18. r.POST("/uploadfile", func(c *gin.Context) {
  19. f, err := c.FormFile("f1")
  20. if err != nil {
  21. c.JSON(http.StatusBadRequest, gin.H{
  22. "code": 10010,
  23. "msg": err.Error(),
  24. })
  25. return
  26. }
  27. // 上传到七牛云
  28. code, url := UploadToQiNiu(f)
  29. c.JSON(http.StatusOK, gin.H{
  30. "code": code,
  31. "msg": "OK",
  32. "url": url,
  33. })
  34. })
  35. // 运行,监听127.0.0.1:8080
  36. r.Run()
  37. }
  38. // 上传图片到七牛云,然后返回状态和图片的url
  39. func UploadToQiNiu(file *multipart.FileHeader) (int, string) {
  40. var AccessKey = "yourAccessKey" // 秘钥对
  41. var SerectKey = "yourSerectKey"
  42. var Bucket = "yourBucket" // 空间名称
  43. var ImgUrl = "http://your.domain.com/" // 自定义域名或测试域名
  44. src, err := file.Open()
  45. if err != nil {
  46. return 10011, err.Error()
  47. }
  48. defer src.Close()
  49. putPlicy := storage.PutPolicy{
  50. Scope: Bucket,
  51. }
  52. mac := qbox.NewMac(AccessKey, SerectKey)
  53. // 获取上传凭证
  54. upToken := putPlicy.UploadToken(mac)
  55. // 配置参数
  56. cfg := storage.Config{
  57. Zone: &storage.ZoneHuanan, // 华南区
  58. UseCdnDomains: false,
  59. UseHTTPS: false, // 非https
  60. }
  61. formUploader := storage.NewFormUploader(&cfg)
  62. ret := storage.PutRet{} // 上传后返回的结果
  63. putExtra := storage.PutExtra{} // 额外参数
  64. // 上传 自定义key,可以指定上传目录及文件名和后缀,
  65. key := "image/" + file.Filename // 上传路径,如果当前目录中已存在相同文件,则返回上传失败错误
  66. err = formUploader.Put(context.Background(), &ret, upToken, key, src, file.Size, &putExtra)
  67. // 以默认key方式上传
  68. // err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, src, fileSize, &putExtra)
  69. // 自定义key,上传指定路径的文件
  70. // localFilePath = "./aa.jpg"
  71. // err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)
  72. // 默认key,上传指定路径的文件
  73. // localFilePath = "./aa.jpg"
  74. // err = formUploader.PutFile(context.Background(), &ret, upToken, key, localFilePath, &putExtra)
  75. if err != nil {
  76. code := 501
  77. return code, err.Error()
  78. }
  79. url := ImgUrl + ret.Key // 返回上传后的文件访问路径
  80. return 0, url
  81. }

demo代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/509419
推荐阅读
相关标签
  

闽ICP备14008679号