• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

用beego实现上传视频图片到七牛云 | 青训营

武飞扬头像
Palp1tate
帮助1

安装

执行命令:

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

获取凭证

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

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

学新通

配置app.conf

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

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

学新通

上代码

我将上传文件的代码封装在了函数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)
}

这个函数会直接返回上传文件的外链访问地址,例如: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函数需要传三个参数~

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbcaeh
系列文章
更多 icon
同类精品
更多 icon
继续加载