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

简介: 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 utils
import (
  "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 model
import (
  "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.QiniuyunServer
func UploadFile(file multipart.File, fileSize int64) (string, int) {
  putPolicy := storage.PutPolicy{
    Scope: server.Bucket,
  }
  // 获取上传token
  mac := 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.Key
  return 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.ZoneHuadong
  case 2:
    return &storage.ZoneHuadongZheJiang2
  case 3:
    return &storage.ZoneHuabei
  case 4:
    return &storage.ZoneHuanan
  default:
    return &storage.ZoneHuadong
  }
}

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

上传文件路由的书写

package v1
import (
  "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.Size
  url, 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
相关文章
|
9天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
46 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
25天前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
51 4
|
28天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
106 67
|
4天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
32 12
|
4天前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
16天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
52 3
|
7天前
|
监控 算法 安全
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
19 0
|
29天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
40 1
|
21天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
1月前
|
存储 前端开发 Java
深入理解后端开发:从基础到高级
本文将带你走进后端开发的神秘世界,从基础概念到高级应用,一步步揭示后端开发的全貌。我们将通过代码示例,让你更好地理解和掌握后端开发的核心技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。

热门文章

最新文章