东林博客

GoFrame上传图片到七牛云

Go上传图片到七牛云还是很简单的,我博客使用的是GoFrame框架,因为发布文章时,上传缩略图,和文字内容插入图片都需要上传图片,所以封装了一个上传七牛的包。

首先安装Go的七牛SDK

go get -u github.com/qiniu/api.v7

然后在根目录library 中新建 /library/qiniu/qiniu.go

package qiniu

import (
   "bytes"
   "context"
   "github.com/gogf/gf/g"
   "github.com/gogf/gf/g/util/gconv"
   "github.com/gogf/gf/g/util/grand"
   "github.com/qiniu/api.v7/auth/qbox"
   "github.com/qiniu/api.v7/storage"
)

func UploadByte(data []byte, ext string) (string, error) {
   outurl := gconv.String(g.Config().Get("qiniu.outurl"))       // 配置CDN域名
   bucket := gconv.String(g.Config().Get("qiniu.bucket"))       // 配置仓库
   accessKey := gconv.String(g.Config().Get("qiniu.accessKey")) // 配置七牛accesskey
   secretKey := gconv.String(g.Config().Get("qiniu.secretKey")) // 配置七牛secretkey

   putPolicy := storage.PutPolicy{
      Scope: bucket,
   }

   mac := qbox.NewMac(accessKey, secretKey)
   upToken := putPolicy.UploadToken(mac) // 获取七牛云的token

   cfg := storage.Config{}
   // 空间对应的机房
   cfg.Zone = &storage.ZoneHuadong
   // 是否使用https域名
   cfg.UseHTTPS = false
   // 上传是否使用CDN上传加速
   cfg.UseCdnDomains = false

   formUploader := storage.NewFormUploader(&cfg)
   ret := storage.PutRet{}
   putExtra := storage.PutExtra{
      Params: map[string]string{
         "x:name": "github logo",
      },
   }
   dataLen := int64(len(data))
   fileName := grand.Letters(32); // 使用goframe的随机数生成32位字符串
   filePath := fileName + ext     // 拼成图片URL
   err := formUploader.Put(context.Background(), &ret, upToken, filePath, bytes.NewReader(data), dataLen, &putExtra)
   if err != nil {
      return outurl + filePath, err
   }
   return outurl + filePath, nil
}

封装好,在其他控制器中可以直接调用了。

package upload

import (
   "gblog/library/qiniu"
   "gblog/library/response"
   "github.com/gogf/gf/g"
   "github.com/gogf/gf/g/net/ghttp"
   "github.com/gogf/gf/g/os/gfile"
   "github.com/gogf/gf/g/os/glog"
)

type Controller struct {
}
/**
 * Ueditor 配置文件
 */
func (c *Controller) GetUeditorConfig(r *ghttp.Request) {

   config := `{ "imageActionName": "uploadimage", "imageFieldName": "file", "imageMaxSize": 2048000, "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], "imageCompressEnable": true, "imageCompressBorder": 1600, "imageInsertAlign": "none", "imageUrlPrefix": "", "imagePathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", "scrawlActionName": "uploadscrawl", "scrawlFieldName": "upfile", "scrawlPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", "scrawlMaxSize": 2048000, "scrawlUrlPrefix": "", "scrawlInsertAlign": "none", "snapscreenActionName": "uploadimage", "snapscreenPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", "snapscreenUrlPrefix": "", "snapscreenInsertAlign": "none", "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], "catcherActionName": "catchimage", "catcherFieldName": "source", "catcherPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", "catcherUrlPrefix": "", "catcherMaxSize": 2048000, "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], "videoActionName": "uploadvideo", "videoFieldName": "upfile", "videoPathFormat": "/ueditor/php/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", "videoUrlPrefix": "", "videoMaxSize": 102400000, "videoAllowFiles": [ ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], "fileActionName": "uploadfile", "fileFieldName": "upfile", "filePathFormat": "/ueditor/php/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", "fileUrlPrefix": "", "fileMaxSize": 51200000, "fileAllowFiles": [ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" ], "imageManagerActionName": "listimage", "imageManagerListPath": "/ueditor/php/upload/image/", "imageManagerListSize": 20, "imageManagerUrlPrefix": "", "imageManagerInsertAlign": "none", "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], "fileManagerActionName": "listfile", "fileManagerListPath": "/ueditor/php/upload/file/", "fileManagerUrlPrefix": "", "fileManagerListSize": 20, "fileManagerAllowFiles": [ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" ] }`
   r.Response.Write(config)
}

/**
 * elementUI 上传接口
 */
func (c *Controller) Upload(r *ghttp.Request) {

   if file, h, err := r.FormFile("file"); err == nil {
      defer file.Close()
      ext := gfile.Ext(h.Filename)
      fileName := gfile.Basename(h.Filename)
      buffer := make([]byte, h.Size)
      url, err := qiniu.UploadByte(buffer, ext)
      if (err != nil) {
         glog.Error(err)
         response.Json(r, 500, err.Error())
      }
      response.Json(r, 200, "", g.Map{
         "url":  url,
         "name": fileName,
      })
   }

}


{{tip}}