go语言后端开发学习(二)——基于七牛云实现的资源上传模块

前言

在之前的文章中我介绍过我们基于gin框架怎么实现本地上传图片和文本这类的文件资源(具体文章可以参考gin框架学习笔记(二) ——相关数据与文件的响应),但是在我们实际上的项目开发中一般却是不会使用本地上传资源的方式来上传的,因为文件的上传与读取会频繁进行磁盘读写,会造成资源的不必要浪费,所以我们一般会寻找第三方平台来托管我们的一些文件资源,而这也就是我们今天的主题——基于七牛云平台来实现我们的资源上传模块

注册七牛云平台

七牛云网址
然后我们点击对象存储尝试创建存储空间,填写信息:
在这里插入图片描述
博主提前创建了一个空间来存储今天我们要测试的文件:
在这里插入图片描述
然后接下来我们来看一下如何实现资源的上传。

资源上传模块的上传

一.相关环境的配置与配置文件的编写与读取

由于使用七牛云进行对象存储需要使用七牛云的第三方SDK,这需要我们使用第三方库,下载命令如下:

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

和之前JWT登录验证一样我们首先来配置一下我们的配置文件:

[qiniuyun]
Zone=
Bucket=
AccessKey=
SecretKey=
Domain=

上面的就是我们主要要配置的信息了,由于这个信息私密性比较强,我就不展示我的具体内容了,大家见谅,接下来我给大家讲一下每个参数的作用:

  • Zone:这个参数主要是指定仓库内的存储区域,比如你是华东区域,那这里就是storage.ZoneHuadong(注意: 博主这里用的是国内的,也推荐大家用国内的,国外的访问速度比较慢,可能会影响使用体验)
  • Bucket:你的空间名称
  • AccessKey与SecretKey:个人密钥,Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key和Secret Key,这个到个人中心的密钥管理中就可以找到了。
  • Domain:域名,主要是我们进行文件访问的时候会使用,可以使用七牛云所提供的临时域名,也可以使用自己的个人域名。

配置好了配置文件后我们就可以来读取配置文件了,老规矩,还是go-ini包,如果不知道的话可以参考博主的文章:
go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件

读取配置的代码如下:

package utilsimport ("fmt""github.com/sirupsen/logrus""gopkg.in/ini.v1"
)type Config struct {Server         *server    `ini:"server"`Database       *database  `ini:"database"`QiniuyunServer *qNYServer `ini:"qiniuyun"`
}type server struct {AppMode  string `ini:"AppMode"`HttpPort string `ini:"HttpPort"`JWTKey   string `ini:"JWTKey"`
}type database struct {Db         string `ini:"Db"`DbName     string `ini:"DbName"`DbUser     string `ini:"DbUser"`DbPassWord string `ini:"DbPassWord"`DbHost     string `ini:"DbHost"`DbPort     string `ini:"DbPort"`
}type qNYServer struct {AccessKey string `ini:"AccessKey"`SecretKey string `ini:"SecretKey"`Bucket    string `ini:"Bucket"`Domain    string `ini:"Domain"`Zone      int    `ini:"Zone"`
}var ServerSetting = &server{AppMode:  "debug",HttpPort: ":3000",JWTKey:   "LuoYu123",
}var DatabaseSetting = &database{Db:         "mysql",DbName:     "goblog",DbUser:     "root",DbPassWord: "ba161754",DbHost:     "localhost",DbPort:     "3306",
}var QiniuyunServer = &qNYServer{AccessKey: "your_access_key",SecretKey: "your_secret_key",Bucket:    "your_bucket",Domain:    "your_domain",Zone:      1,
}// Config_Message
var Config_Message = &Config{Server:         ServerSetting,Database:       DatabaseSetting,QiniuyunServer: QiniuyunServer,
}func init() {filename := "config/config.ini"cfg, err := ini.Load(filename)if err != nil {logrus.Errorf("配置文件加载失败: %v", err)}err = cfg.MapTo(Config_Message)if err != nil {logrus.Errorf("配置文件映射失败: %v", err)}logrus.Infof("配置文件加载成功")fmt.Println(Config_Message.QiniuyunServer.Domain)
}

数据模型中上传模块的书写

package modelimport ("context""gin_vue_blog/utils""gin_vue_blog/utils/errmsg""github.com/qiniu/go-sdk/v7/auth/qbox""github.com/qiniu/go-sdk/v7/storage""mime/multipart"
)var server = utils.Config_Message.QiniuyunServerfunc UploadFile(file multipart.File, fileSize int64) (string, int) {putPolicy := storage.PutPolicy{Scope: server.Bucket,}// 获取上传tokenmac := qbox.NewMac(server.AccessKey, server.SecretKey)upToken := putPolicy.UploadToken(mac)// 设置上传配置cfg := setConfig()// 构建表单上传的对象formUploader := storage.NewFormUploader(cfg)ret := storage.PutRet{}putExtra := storage.PutExtra{}err := formUploader.PutWithoutKey(context.Background(), &ret, upToken, file, fileSize, &putExtra)if err != nil {return "", errmsg.ERROR}url := server.Domain + ret.Keyreturn url, errmsg.SUCCESS
}func setConfig() *storage.Config {return &storage.Config{Region:        selectZone(server.Zone),UseHTTPS:      false,UseCdnDomains: false,}
}func selectZone(Zone int) *storage.Zone {switch server.Zone {case 1:return &storage.ZoneHuadongcase 2:return &storage.ZoneHuadongZheJiang2case 3:return &storage.ZoneHuabeicase 4:return &storage.ZoneHuanandefault:return &storage.ZoneHuadong}
}

备注:selectZone是因为我那里使用的是数字代指这里转换一下

上传文件路由的书写

package v1import ("gin_vue_blog/model""gin_vue_blog/utils/errmsg""github.com/gin-gonic/gin"
)func Upload(c *gin.Context) {file, fileHeader, _ := c.Request.FormFile("file")filesize := fileHeader.Sizeurl, code := model.UploadFile(file, filesize)c.JSON(200, gin.H{"status":  code,"message": errmsg.GetErrMsg(code),"url":     url,})
}

运行并测试

在这里插入图片描述
如上所示:我们成功的上传了一张图片,大家有兴趣可以试试这个url是否可以使用:

http://sepff60lp.hd-bkt.clouddn.com/Fse9JUhe5miWPy2rNI0qtfGrSBSJ

参考文章

七牛云开发者中心

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds+

Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds 加载一张宽高约100px多些的小图,是一张相当小的正常图片,loading Bitmap from RESOURCE_DISK_CACHE竟然耗时达到惊人的3秒左右!(打开Glide调试…

推荐使用三丰云免费云服务器、免费虚拟主机

官网地址:www.sanfengyun.com 三丰云服务器: 配置高:能够轻松运行应用程序和网站,在处理大量请求和保持高可靠性方面表现出色。 易用性好:界面直观、简单,能够轻松管理服务器和资源,快速创建和…

vs调试时无法找到文件-chromium源码编译

一直跟着教程走结果报错了,找了半天的教程无法解决,于是乎只好重来,因为这个是属于项目调试,报错了可以重新编译项目就好。在重新做的过程中发现路径写错了

C#操作MySQL从入门到精通(22)——创建表与操纵表

前言 我们新建数据库以后,最需要做的就是创建表,对数据库的操作绝大多数情况下都是都对表的操作,本文就是讲解如何创建表以及修改表中的列,修改表名等操作。由于创建表的方法基本上有两种,一种是使用带有界面的工具比如Navicate来创建表,另一种是使用sql语句来创建表,实…

SSL/TLS和HTTPS

HTTPS就是用了TLS包装的Socket进行通信的HTTP 混合加密 被称为混合加密。具体过程如下: 使用非对称加密协商对称密钥: 在通信的开始阶段,通常由客户端和服务器使用非对称加密算法(如RSA)来协商一个对称密钥。通常情…

AI智能体的分级

技术的分级 人们往往通过对一个复杂的技术进行分级,明确性能、适用范围和价值,方便比较、选择和管理,提高使用效率,促进资源合理分配和技术改进和标准化。 比如,国际汽车工程师学会(SAE)定义了自…

CAD2022下载与安装

CAD2022下载与安装 安装包下载安装包解压缩软件安装安装完成 安装包下载 安装包下载链接: https://pan.xunlei.com/s/VNyyAVUev-7XHig_2VIGiTN1 提取码:mxt8 下载安装包,完成后,得到一个压缩文件 安装包解压缩 右键解压到当前…

[word] word文字间隙怎么调整? #媒体#职场发展

word文字间隙怎么调整? 在文档中的数据包含英文、数字、中文等,会有间隙,有时候误以为是空格,但是根本删除不了,其实这是默认的间隙,是可以调整的,下面教大家word文字间隙怎么调整的操作&#…

ffmpeg实现视频播放 ----------- Javacv

什么是Javacv和FFmpeg? Javacv是一个专门为Java开发人员提供的计算机视觉库,它基于FFmpeg和Opencv库,提供了许多用于处理图 像、视频和音频的功能。FFmpeg是一个开源的音视频处理工具集,它提供了用于编码、解码、转换和播放音视频…

工业物联网和工业互联网有啥区别?

如今数字化转型已成为工业领域的必然趋势,其中,工业物联网(IIoT)和工业互联网作为推动工业数字化转型的重要力量,它们的共同目标都是为了提升工业生产的效率、降低成本并推动创新,但在技术特点和应用场景上…

【QT5】<知识点> QT常用知识(更新中)

目录 一、更改文本颜色和格式 二、QT容器类 三、字符串与整数、浮点数之间的转换 四、QString常用功能 五、SpinBox的属性介绍 六、滑动、滚动、进度条和表盘LCD 七、时间、日期、定时器 一、更改文本颜色和格式 动态设置字体粗体:QFont对象的setBold方法动态…

两种AI 图像生成技术:MidJourney 和 Stable Diffusion

目录 1、MidJourney1.1 MidJourney基本特点1.2 MidJourney的玩法教程 2、Stable Diffusion2.1 Stable Diffusion基本特点:2.2 Stable Diffusion生成展示 3、两种技术的区别4、AI 绘画与它们的联系5、总结 MidJourney 和 Stable Diffusion 是当前两种流行的 AI 图像生…

tkinter+火山引擎+python实现语音识别聊天机器人

想要做一款能通过语音识别来聊天的智能机器人,首先需要能通过麦克风录制语音进行识别转换成文字,将文字发送给机器人得到聊天结果,并能将返回的文字转换成语音进行合成,之后再通过本地播放语音实现语音交互。 架构: 实现步骤 一、本地录音 本地录音可以通过pyAudio库实…

pikachu靶场上的暴力破解

目录 一、暴力破解 基于表单的暴力破解 验证码绕过(on server) ​编辑 验证码绕过(on client) ​编辑 token防爆破? 二、暴力破解的相关知识点 (1)Burte Force(暴力破解)概述 (2)验证码的绕过原理 【验证码机制原理】 【客户端可能存在的安全…

【云原生】Kubernetes----Helm包管理器

目录 引言 一、Helm概述 1.Helm价值概述 2.Helm的基本概念 3.Helm名词介绍 二、安装Helm 1.下载二进制包 2.部署Helm环境 3.添加补全信息 三、使用Helm部署服务 1.创建chart 2.查看文件信息 3.安装chart 4.卸载chart 5.自定义chart服务部署 6.版本升级 7.版本…

宝兰德受邀出席第八届丝绸之路网络安全论坛

近日,2024第八届丝绸之路网络安全论坛在陕西宾馆会议中心成功举办,本次论坛以“汇聚万千智慧 夯实安全堤坝”为主题,由主论坛及密码技术与密评、教育行业网络安全、卫健行业网络安全三个平行分论坛组成,论坛邀请业内专家学者、企业…

【面经总结】 Java基础 - 异常

异常 介绍一下 Java 的异常体系 Java 的异常体系是由 Throwable 类及其子类构成的。 Throwable 包含两个子类:Error(错误)和 Exception(异常) Error 表示错误,通常不需要程序员处理,如内存溢…

如何解决访问网站时IP被限制的问题?

在互联网上,用户可能会面临一个令人困扰的问题——当尝试访问某个特定的网站时,却发现自己的IP地址被该网站屏蔽。 IP地址被网站屏蔽是一个相对常见的现象,而导致这种情况的原因多种多样,包括恶意行为、违规访问等。本文将解释IP地…

扩散模型Stable Diffusion

扩散模型构成 Text Encoder(CLIPText) Clip Text为文本编码器。以77 token为输入,输出为77 token 嵌入向量,每个向量有768维度。 Diffusion(UNetScheduler) 在潜在空间中逐步处理扩散信息。以文本嵌入向量和由噪声组成的起始多维数组为输入&#xff0c…

DPI简析

DPI简析 一、DPI与PPI二、硬件设备的DPI2.1打印机DPI2.2显示器DPI2.2.1显示器DPI计算2.2.2显示器分辨率与系统分辨率2.2.3常见分辨率 2.3鼠标DPI 三、图片DPI3.1图片DPI与打印尺寸3.1.1图片打印尺寸计算3.1.2常用的照片尺寸及DPI 3.2图片DPI与屏幕显示3.3修改图片DPI 参考文档 …