当前位置: 首页 > news >正文

golang学习笔记08——如何调用阿里oss sdk实现访问对象存储?

  • 推荐学习文档
    • 基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • golang学习笔记01——基本数据类型
    • golang学习笔记02——gin框架及基本原理
    • golang学习笔记03——gin框架的核心数据结构
    • golang学习笔记04——如何真正写好Golang代码?
    • golang学习笔记05——golang协程池,怎么实现协程池?
    • golang学习笔记06——怎么实现本地文件及目录监控-fsnotify
    • golang学习笔记07——使用gzip压缩字符减少redis等存储占用的实现

首先确保安装了阿里云 OSS 的 Go SDK:

go get -u github.com/aliyun/aliyun-oss-go-sdk/oss

以下是代码示例:

  • 填入你的以下参数,可以直接使用访问:
    • BucketName:存储桶名字
    • Endpoint:访问域名,例如:https://oss-cn-beijing.aliyuncs.com
    • AccessKeyId:oss访问key id
    • AccessKeySecret:oss访问key secret

具体操作:在一个目录下创建两个文件:alioss_facade.go和client.go

    1. alioss_facade.go代码如下:
package aliossimport ("context""github.com/aliyun/aliyun-oss-go-sdk/oss""time"
)const GTimeout = time.Hour // 全局默认过期时间 1小时var Client = new(client)func (c *client) Init() error {c.BucketName = "你的存储桶名字"c.Endpoint = "你的访问域名,例如:https://oss-cn-beijing.aliyuncs.com"c.AccessKeyId = "你的oss访问key id"c.AccessKeySecret = "你的oss访问key secret"return nil
}// GenUploadUrl 获取具有文件上传权限的路径临时链接(这个链接就可以给前端访问上传文件)
func (c *client) GenUploadUrl(key string) (*OssSignature, error) {ossSignature, err := c.generateOssSignature(c.BucketName, key, GTimeout)if err != nil {fmt.Printf("GenUploadUrl generateOssSignature err: [%+v]", err)return nil, err}return ossSignature, nil
}// GetRemoteSignUrl 获取一个指定存储路径的临时访问地址
/*key: 从 bucket 名字开始的文件路径
*/
func (c *client) GetRemoteSignUrl(key string) (string, error) {if key == "" {return "", nil}bucket, err := c.newClientWithBucket(c.BucketName)if err != nil {fmt.Printf("GetRemoteSignUrl newClientWithBucket newClient err: [%+v]", err)return "", err}url, err := bucket.SignURL(key, oss.HTTPGet, int64(time.Hour*24)) // 一天有效期if err != nil {fmt.Printf("GetRemoteSignUrl SignURL err: [%+v]", err)return "", err}return url, nil
}// GetRemoteSignUrlWithNoError 不以错误的返回指定存储路径的临时访问地址(防止避免在文件不存在时前端提示错误的场景)
func (c *client) GetRemoteSignUrlWithNoError(path string) string {if path == "" {return ""}bucket, err := c.newClientWithBucket(c.BucketName)if err != nil {fmt.Printf("GetRemoteSignUrlWithNoError newClientWithBucket newClient err: [%+v]", err)return ""}url, err := bucket.SignURL(path, oss.HTTPGet, int64(time.Hour*24)) // 一天有效期if err != nil {fmt.Printf("GetRemoteSignUrlWithNoError SignURL err: [%+v]", err)return ""}return url
}
    1. alioss_facade.go代码如下:
package aliossimport ("context""crypto/hmac""crypto/sha1""encoding/json""fmt""github.com/aliyun/aliyun-oss-go-sdk/oss""time"
)func Base64Encode(str string) string {return base64.StdEncoding.EncodeToString([]byte(str))
}type client struct {BucketName      string // 存储桶名称Endpoint        string // oss访问域名AccessKeyId     string // oss访问key idAccessKeySecret string // oss访问key secret
}func (c *client) newClient() (*oss.Client, error) {cli, err := oss.New(c.Endpoint, c.AccessKeyId, c.AccessKeySecret)if err != nil {fmt.Printf("alioss newClient err: [%+v]", err)return nil, err}return cli, nil
}func (c *client) newClientWithBucket(bucketName string) (*oss.Bucket, error) {cli, err := oss.New(c.Endpoint, c.AccessKeyId, c.AccessKeySecret)if err != nil {fmt.Printf("alioss newClient err: [%+v]", err)return nil, err}return c.getBucket(cli, bucketName)
}type OssSignature struct {SignUrl     stringAccessKeyId string `json:"accessKeyId"`//Host           string `json:"host"`Policy    string `json:"policy"`Signature string `json:"signature"`//SecurityToken  string `json:"securityToken"`//ExpirationTime string `json:"expirationTime"`
}func generateSignature(message string, key string) string {hash := hmac.New(sha1.New, []byte(key))hash.Write([]byte(message))signature := hash.Sum(nil)return Base64Encode(string(signature))
}func (c *client) generateOssSignature(host, objectName string, expirationTime time.Duration) (*OssSignature, error) {// 生成策略//policy := fmt.Sprintf(`{"Version":"1","Statement":[{"Action":["oss:PutObject"],"Effect":"Allow","Resource":"acs:oss:%s:%s:%s"}]}`, host, c.BucketName, objectName)//policy := fmt.Sprintf(`{"Version":"1","Statement":[{"Action":["oss:PutObject"],"Effect":"Allow","Resource":"acs:oss:*:*:%s"}]}`, host)//policy := fmt.Sprintf(`{"expiration": "2034-01-01T12:00:00.000Z","conditions":[["content-length-range", 0, 1048576000]]}]}`)//policyB64 := Base64Encode(policy)// 生成签名URLpolicyText := map[string]interface{}{"expiration": getFullTimeoutZ(expirationTime),"conditions": [][]interface{}{{"content-length-range", 0, 1048576000},},}policyTextJson, _ := json.Marshal(policyText)policy := Base64Encode(string((policyTextJson)))// 生成签名signature := generateSignature(policy, c.AccessKeySecret)return &OssSignature{AccessKeyId: c.AccessKeyId,Policy:      policy,Signature:   signature,SignUrl:     fmt.Sprintf("https://%s.oss-cn-beijing.aliyuncs.com", host),	// 生成签名地址}, nil
}func (c *client) getBucket(cli *oss.Client, bucketName string) (*oss.Bucket, error) {bucket, err := cli.Bucket(bucketName)if err != nil {fmt.Printf("alioss getBucket err: [%+v]", err)return nil, err}return bucket, nil
}func getFullTimeoutZ(expirationTime time.Duration) string {return time.Now().Add(expirationTime).Format("2006-01-02T15:04:05.000Z")
}

至此,在你的main方法中,或者业务代码中,调用alioss_facade.go中的对外方法,即可访问或写入存储桶的数据。

关注我看更多有意思的文章哦!👉👉


http://www.mrgr.cn/news/21280.html

相关文章:

  • 使用PowerShell限制Microsoft Exchange邮件大小
  • C++和OpenGL实现3D游戏编程【连载8】——纹理文字实现与优化
  • http模块 - 创建Web服务以及案例
  • C++隐式转换
  • TYPE-C USB设计
  • 【C++二分查找】1818. 绝对差值和
  • C#/.NET/.NET Core推荐学习路线文档文章
  • 【30天玩转python】条件语句与循环
  • 012.Oracle-索引
  • Vulkan描述符、描述符Pool、Layout概念
  • C++ | Leetcode C++题解之第390题消除游戏
  • 深度评测热门翻译工具,携手你的翻译得力助手
  • 电器维修系统小程序的设计
  • Chapter 12 Vue CLI脚手架组件化开发
  • 基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真
  • PowerMock 单元测试总结与常见坑解决方案
  • 代码随想录Day 36|滑铁卢了,leetcode题目:1049.最后一块石头的重量、494.目标和、474.一和零
  • IPC$漏洞多位密码爆破方法
  • 一分钟了解渗透测试
  • windows C++-并行编程-转换使用异常处理的 OpenMP 循环以使用并发运行时