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

文章目录

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

安装

执行命令:

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)
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/68327.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系列七、RocketMQ如何保证顺序消费消息

一、概述 所谓顺序消费指的是可以按照消息的发送顺序来进行消费。例如一笔订单产生了3条消息,即下订单》减库存》增加订单,消费时要按照顺序消费才有意义,要不然就乱套了(PS:你总不能订单还没下,就开始减库…

Vue-2.nodejs的介绍和安装

nodejs简介 ► 创建 Node.js 应用:package.json 首先,创建一个新文件夹以便于容纳需要的所有文件,并且在此其中创建一个 package.json 文件,描述你应用程序以及需要的依赖: 配合着你的 package.json 请运行 npm install。如果你…

基于ffmpeg与SDL的视频播放库

由于工作需要,自己封装的基于ffmpeg的视频编解码库,显示采用了SDL库。可以播放本地文件或网络流,支持多端口播放,支持文字叠加,截图、视频录制等等。 头文件代码: #pragma once #ifdef __DLLEXPORT #defin…

SpringCloud实用篇5——elasticsearch基础

目录 1.初识elasticsearch1.1 了解ES1.1.1 elasticsearch的作用1.1.2 ELK技术栈1.1.3 elasticsearch和lucene1.1.4 总结 1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排 1.3 es的一些概念1.3.1 文档和字段1.3.2 索引和映射1.3.3 mysql与elasticsearch 1.4 部署单点…

flutter开发实战-TextPainter计算文本内容的宽度

flutter开发实战-TextPainter计算文本内容的宽度 最近开发过程中根据Text文本的大小判断是否需要进行显示跑马灯效果,获取文本的大小,需要TextPainter来获取Size 一、TextPainter TextPainter主要用于实现文本的绘制。TextPainter类可以将TextSpan渲染…

浏览器多管闲事之跨域

年少时的梦想就是买一台小霸王游戏机 当时的宣传语就是小霸王其乐无穷~。 大些了,攒够了零花钱,在家长的带领下终于买到了 那一刻我感觉就是最幸福的人 风都是甜的! 哪成想... 刚到家就被家长扣下了 “”禁止未成年人玩游戏机 (问过卖家了&a…

Window下安装MinGW64

欢迎来到我的酒馆 介绍Windows下,安装MinGW64。 目录 欢迎来到我的酒馆二.MinGW64三.配置系统环境变量 二.MinGW64 从sourceforge下载mingw64, sourceforge下载MinGW https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 下…

香港站群服务器为什么适合seo优化?

​  香港站群为什么适合seo优化?本文主要从以下四点出发进行原因阐述。 1.香港站群服务器的优势 2.香港站群服务器与国内服务器的对比 3.多IP站群服务器的优势 4.香港站群服务器在SEO优化中的注意事项 1.香港站群服务器的优势 香港站群服务器是为了满足企业SEO优化需求而提供…

实践分享:Vue 项目如何迁移小程序

最近我们小组刚经历了将成熟的 HTML5 项目转换成小程序,并在app中运行的操作!记录下来分享给各位。 项目:将已有的 Vue 项目转为小程序, 在集成了FinClip SDK 的 App 中运行。 技术:uni-app、FinClip 两个注意事项&…

[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目

文章目录 1.参考项目2.技能点3.GO的Dockerfile配置后端的结构如图Dockerfile先手动docker调试服务是否可以启动报错 4.Vue的Dockerfile配置前端的结构如图nginx_docker.confDockerfile构建 5.docker-compose 整合前后端docker-compose.yml错误记录(1)ip端…

PS AI版本安装教程

好久没写博客了,今天更新一下子吧! 随着chatGPT的提出,各种软件逐渐开始镶嵌人工智能,为我们的生活带来了极大的便利!话不多说,开始介绍今天的主角,PS的AI版本。 安装教程: 1.安装…

Docker一键部署项目,无需登录XShell

文章目录 一键部署项目Docker手动部署SpringBoot项目编写docker部署的脚本文件script.sh 脚本内容 特别注意!编写dockerfiledockerfile 文件内容 上传后端服务的jar包到服务器中执行 script 脚本部署后端服务 自动部署SpringBoot项目引入jsch依赖编写jsch工具类执行…

工业4.0:欢迎来到智能制造

制造业正在经历一场被称为“工业4.0”的全新技术革命,这场革命将数字化、网络化、智能化和自动化技术融合在一起,旨在打造高质、高效、高产且可持续的智能工厂。工业4.0将彻底改变产品制造的方式,颠覆我们对制造业的传统认知。 什么是工业4.…

【Java】try|catch|throws 具体详解+应用

目录 tryCatch 基本介绍 使用细节 throws异常处理 基本介绍 ​ 使用细节 自定义异常 基本概念 步骤 throw和throws的区别 tryCatch 基本介绍 使用细节 throws异常处理 基本介绍 使用细节 自定义异常 基本概念 步骤 throw和throws的区别

【数据结构】Disruptor环形数组无锁并发框架阅读

Disruptor 是苹国外厂本易公司LMAX开发的一个高件能列,研发的初夷是解决内存队列的延识问顾在性能测试中发现竟然与10操作处于同样的数量级),基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCn演讲后,获得了业界关注…

MinGW-W64 下载、安装与配置(支持最新版的GCC,目前 GCC 13.2.0)

文章目录 一、简介1. MinGW 和 MinGW-W64 区别和联系2. MSVCRT 和 UCRT 介绍 二、下载1. 从 sourceforge.net 下载2. 从 github 下载3. 从 镜像站点 下载4. 自己编译 三、安装与配置1. 在线安装2. 离线安装3. 环境配置 四、总结 一、简介 1. MinGW 和 MinGW-W64 区别和联系 M…

数组slice、splice字符串substr、split

一、定义 这篇文章主要对数组操作的两种方法进行介绍和使用,包括:slice、splice。对字符串操作的两种方法进行介绍和使用,包括:substr、split (一)、数组 slice:可以操作的数据类型有:数组字符串 splice:数组 操作数组…

【go语言学习笔记】04 Go 语言工程管理

文章目录 一、质量保证1. 单元测试1.1 定义1.2 Go 语言的单元测试1.3 单元测试覆盖率 2. 基准测试2.1 定义2.2 Go 语言的基准测试2.3 计时方法2.4 内存统计2.5 并发基准测试2.6 基准测试实战 3. 特别注意 二、性能优化1. 代码规范检查1.1 定义1.2 golangci-lint1.2.1 安装1.2.2…

vue3 + ts+element-plus学习笔记

子组件通过defineProps方法接收父组件传递过来的数据,是vue3中提供的方法,不需要引入,直接使用 方法的写法: const onClick (){... }自定义事件: 子组件点击事件 全局事件总线 mitt 兄弟组件之间的事件&#x…

【福建事业单位-资料分析】03 比重和平均数

【福建事业单位-资料分析】03 比重和平均数 一、比重(现期比重,基期比重、两期比重)1.1 现期比重增长贡献量,利润率 1.2基期比重(用现期和增长率逆求)1.3两期比重(难点重点)——比较…