beego实现文件上传到七牛云详细教程

文章目录

  • 安装
  • 获取凭证
  • 配置`app.conf`
  • 上代码
  • 调用示例
  • ps

安装

执行命令:

go get github.com/qiniu/go-sdk/v7

获取凭证

Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access KeySecret Key,这对密钥可以通过如下步骤获得:

  1. 点击注册开通七牛开发者帐号
  2. 如果已有账号,直接登录七牛开发者后台,点击这里查看 Access Key 和 Secret Key

beego实现文件上传到七牛云详细教程_第1张图片

配置app.conf

首先咱们在app.conf里配置好凭证等信息:

SecretKey = your secretkey
AccessKey = your accesskey
Bucket = your bucket
Domain = your domain

beego实现文件上传到七牛云详细教程_第2张图片

上代码

我将上传文件的代码封装在了函数Upload里:

package controllers

import (
	"context"
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	"github.com/beego/beego/v2/server/web"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
	"io"
	"mime/multipart"
	"strings"
	"time"
)

type baseController struct {
	web.Controller
	o orm.Ormer
}

func (c *baseController) Prepare() {
	c.o = orm.NewOrm()
}

//这里才是核心代码
func (c *baseController) Upload(file multipart.File, header *multipart.FileHeader, err error) string {
	var reader io.Reader = file
	var size = header.Size

	defer file.Close()

	if err != nil {
		return ""
	}

	// 取文件后缀
	suffix := ""
	if header.Filename != "" && strings.Contains(header.Filename, ".") {
		suffix = header.Filename[strings.LastIndex(header.Filename, ".")+1:]
		suffix = strings.ToLower(suffix)
	}
	
    //获取配置
	secretKey, _ := web.AppConfig.String("SecretKey")
	accessKey, _ := web.AppConfig.String("AccessKey")
	bucket, _ := web.AppConfig.String("Bucket")
	domain, _ := web.AppConfig.String("Domain")
	key := fmt.Sprintf("%d.%s", time.Now().UnixNano(), suffix)
	putPolicy := storage.PutPolicy{
		Scope: fmt.Sprintf("%s:%s", bucket, key),
	}
	mac := qbox.NewMac(accessKey, secretKey)
	upToken := putPolicy.UploadToken(mac)

	cfg := storage.Config{}
	uploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}
	putExtra := storage.PutExtra{
		Params: map[string]string{
			"x:name": header.Filename,
		},
	}

	err = uploader.Put(context.Background(), &ret, upToken, key, reader, size, &putExtra)
	if err != nil {
		return ""
	}

	return fmt.Sprintf("%s/%s", domain, ret.Key)
}

这个函数会直接返回上传文件的外链访问地址,例如:http://rz2n87yck.hn-bkt.clouddn.com/avatar.jpg,这样就可以将这个url存到数据库了。

具体解读:

  1. 类型定义和导入:首先,代码导入了一些必要的包,包括 Beego、七牛云 SDK,以及一些标准库。然后,定义了一个类型 baseController,继承自 web.Controller,并包含一个字段 o,用于处理数据库操作。
  2. Prepare 方法:这个方法是 baseController 的成员方法,用于初始化数据库操作器 o,确保每次请求都可以使用。它在每次请求到来时都会被调用。
  3. Upload 方法:这是代码的核心部分,用于处理文件上传。它接收三个参数:file 是上传的文件的 multipart.Fileheader 是上传文件的头部信息 multipart.FileHeadererr 是上传过程中的错误信息。
    • 首先,将 file 转换为 io.Reader,并获取上传文件的大小。
    • 使用 defer 关键字确保在函数返回前关闭文件。
    • 检查 err,如果有错误,返回空字符串。
    • 提取文件后缀:从上传文件的名字中获取文件后缀名,用于构建存储在七牛云上的文件名。
  4. 获取配置信息:从 Beego 的应用配置中获取七牛云存储所需的配置信息,包括 SecretKeyAccessKeyBucketDomain
  5. 生成存储的文件名和上传凭证:根据当前时间戳和文件后缀生成存储在七牛云上的唯一文件名。然后,创建一个 storage.PutPolicy,指定了上传的范围(Scope),包括存储桶名和文件名。
  6. 生成上传凭证:使用七牛云的 qbox 包中的 NewMac 方法创建一个认证对象 mac,然后使用 PutPolicyUploadToken 方法生成上传凭证 upToken
  7. 初始化上传配置和上传对象:创建 storage.Config 对象和 storage.FormUploader 对象,用于实际执行上传操作。
  8. 执行文件上传:调用 uploader.Put 方法执行文件上传操作。这里传递了上传所需的参数,包括上面生成的 upToken、文件名 key、文件内容的 reader、文件大小 size,以及一个 storage.PutExtra 对象,其中可以包含额外的参数。上传成功后,会得到一个 storage.PutRet 对象。
  9. 返回上传后的文件链接:如果上传成功,使用上传后的文件名构建完整的文件链接,然后返回。

调用示例

package controllers

import (
	"ByteRhythm/models"
	"ByteRhythm/utils"
)

type VideoController struct {
	baseController
}

// Publish 发布视频
func (c *VideoController) Publish() {
if url := c.Upload(c.GetFile("data")); url == "" {
		c.Data["json"] = map[string]interface{}{
			"status_code": 1,
			"status_msg":  "发布失败",
		}
		c.ServeJSON()
		return
}

ps

当然go的其他框架也能用这个函数,可能或有些许的修改,注意Upload函数需要传三个参数~

你可能感兴趣的:(#,beego,Go,golang,beego,七牛云存储)