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.mzph.cn/news/849735.shtml

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

相关文章

Spring Security系列之Handler

概述 与Spring、Spring MVC、Spring Boot一样,Spring Security里也有很多Handler接口、可以分为两大类,一类是普通的XxxHandler(见名知意),另一类是对应的ServerXxxHandler(RequestRejectedHandler除外&am…

短剧看剧系统投流版系统搭建,前端uni-app

目录 前言: 一、短剧看剧系统常规款短剧系统和投流版的区别? 二、后端体系 1.管理端: 2.代理投流端 三、功能区别 总结: 前言: 23年上半年共上新微短剧481部,相较于2022年全年上新的454部&#xff0…

读AI未来进行式笔记06自动驾驶技术

1. 跃层冲击 1.1. 每个社会其实都处于不同的楼层,往往处于更低楼层的社会,要承受来自更高楼层的社会发展带来的更大冲击 2. 驾驶 2.1. 开车时最关键的不是车,而是路 2.2. 人是比机器更脆弱的生命&am…

JavaEE初阶---多线程编程(一.线程与进程)

目录 🤣一.线程与进程的概念与联系: 进程的基本概念: 线程的基本概念: 进程和线程的区别与联系: 🙃代码执行实列: 1.通过继承Thread父类来实现多线程 2.通过实现Runnable接口来实现多线程…

java调用GDAL及JTS实现生成泰森多边形(Voronoi图)的一种方法

目录 一、关于泰森多边形 1.泰森多边形的特性 2.本文的目的 二、实现思路 1.gdal和jts库的maven坐标 2.jts生成泰森多边形的关键代码 3.使用GDAL读取源文件信息的关键代码 4.使用GDAL将生成的泰森多边形写入文件 三、实现结果 1.实现的效果 2.完整代码示例 一、关于…

【稳定检索/投稿优惠】2024年智慧金融与财务管理国际会议(SFFM 2024)

2024 International Conference on Smart Finance and Financial Management 2024年智慧金融与财务管理国际会议 【会议信息】 会议简称:SFFM 2024 截稿时间:以官网为准 大会地点:中国广州 会议官网:www.iacsffm.com 会议邮箱&am…

【漏洞复现】海康威视综合安防管理平台 多处 FastJson反序列化RCE漏洞

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 由于…

【安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务】

安装笔记-系列文章目录 安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务 文章目录 安装笔记-系列文章目录安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务 前言一、软件介绍名称:acme.sh主页官方介绍 二、安装步骤测试版本&#x…

React@16.x(21)渲染流程-更新

目录 1,更新的2种场景2,节点更新3,对比 diff 更新3.1,React 的假设3.1.2,key 2.1,找到了对比的目标2.1.1,节点类型一致1,空节点2,DOM节点3,文本节点4&#xf…

Nginx 配置防护 缓慢的 HTTP拒绝服务攻击+点击劫持:X-Frame-Options未配置

一 安全团队检测网站 1 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击 缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。 慢…

Flink SQL实践

环境准备 方式1:基于Standalone Flink集群的SQL Client 启动Flink集群 [hadoopnode2 ~]$ start-cluster.sh [hadoopnode2 ~]$ sql-client.sh ... 省略若干日志输出... Flink SQL> 方式2:基于Yarn Session Flink集群的SQL Client 启动hadoop集群…

使用difflib实现文件差异比较用html显示

1.默认方式&#xff0c;其中加入文本过长&#xff0c;需要换行&#xff0c;因此做 contenthtml_output.replace(</style>,table.diff td {word-wrap: break-word;white-space: pre-wrap;max-width: 100%;}</style>)&#xff0c;添加换行操作 ps&#xff1a;当前te…

内存经验分享

目录 内存统计工具 /proc/meminfo Buddy ​​​​​​​​​​​​​​Slub ​​​​​​​Procrank /proc/pid/smaps ​​​​​​​Dumpsys meminfo 内存评估 内存泄漏 Lmk 水位调整 内存统计工具 /proc/meminfo 可以提供整体内存信息&#xff0c;各字段表示的意思如…

mysql工具----dbForgeStudio2020

dbForgeStudio2020&#xff0c;除了基本的操作外&#xff0c;还具有可调试mysql存储过程的功能&#xff0c;是一个不可夺得的mysql软件工具。 本文的软件将简单介绍软件的安装方式&#xff0c;仅供学习交流&#xff0c;不可做它用。 1.安装软件&#xff0c;安装后&#xff0c…

【Linux操作系统】Linux中进程的五种状态:R、S、D、T、X以及僵尸进程、孤儿进程

操作系统中有许多同时执行的进程&#xff0c;这些进程都可能处于不同的状态代表着不同的含义。 R运行状态(running) 概念&#xff1a;并不意味着进程一定在运行中&#xff0c;它表明进程要么是在运行中要么在运行队列里。 我们运行可执行程序myproc利用指令 ps ajx可以看到进程…

BC9 printf的返回值

BC9 printf的返回值 这里我们先要了解库函数printf printf的返回值&#xff0c;是写入的字符总数 我们第一遍写代码时候可能写成这样: #include<stdio.h> int main() {int retprintf("Hello world!");printf("%d", ret);return 0; }我们发现这样是通…

问题:在本案复议阶段,复议机关()。 #其他#媒体

问题&#xff1a;在本案复议阶段&#xff0c;复议机关&#xff08;&#xff09;。 A&#xff0e;有权责令被申请人纠正违法的征税行为 B&#xff0e;应当对被申请人作出的税务具体行政行为所依据的事实证据、法律程序、法律依据及设定权利义务内容的合法性、适当性进行全面审…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(上)【入门篇】

文章目录 前言一、获取所有学院信息接口执行二、线程组的介绍 2.1 并发和顺序执行 2.2 优先和最后执行线程组 2.3 线程组的设置细节三、HTTP请求的介绍四、查看结果树的配置使用总结 前言 一、获取所有学院信息接口执行 我们先针对一条简单的接口进行执行&#…

【Spring Cloud Alibaba】13.自建存储对象服务与集成(minio版)

文章目录 简介什么是云存储服务&#xff08;OSS&#xff09;为什么选择MiniIOMiniIO相关地址 搭建(docker)安装Docker部署MinIO创建存储桶配置存储桶设置存储桶可以直接在浏览器访问 集成到Spring Cloud Alibaba项目创建子模块引入依赖包项目结构配置文件工具类接口类测试 简介…

别让你的品牌失去声音,品牌策划如何成为你的王牌?

品牌策划可不仅仅是一个简单的概念&#xff0c;它是一门真正的艺术和科学。 它涉及到在确立品牌定位之后&#xff0c;进行一系列精心设计的传播和推广活动&#xff0c;从而塑造和管理品牌&#xff0c;让品牌价值达到最大化。 在这个竞争激烈的市场中&#xff0c;想要让你的品…