go语言调用阿里云oss对象存储openapi

137 阅读3分钟

简介

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,多种存储类型供选择,全面优化存储成本。OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

官方教程视频

官方文档控制台使用

操作系统调用oss服务工具ossutil根据操作系统选择安装提供了linux,macos,windows版本。

SDK调用提供超过十种编程语言的支持。

Bucket存储空间

在上传文档,图片,音频视频等文件时需要再oss中创建一个存储空间Bucket,然后将无限数量的Object上传到Bucket中 ,同一个Bucket的内部是扁平的,没有文件系统的目录等概念,所有的Object都直接隶属于其对应的Bucket。Bucket的名称在OSS范围内全局唯一,且创建之后无法修改。OSS提供了相关的工具如ossutil或者API接口来管理这些资源。

Object存储对象

对象(Object)是OSS存储数据的基本单元,也被称为OSS的文件。和传统的文件系统不同,Object也没有文件目录层级结构的关系。

SDK访问

阿里云oss提供了使用REST API或封装了REST API的阿里云SDK向OSS发起请求。认证系统收到请求后,会通过凭证验证请求的发送者身份。身份验证成功后,您可以操作相应的OSS资源。

image.png

image.png

请准备好访问凭证AccessKeyId、AccessKeySecret.

github地址

下载SDKgo get github.com/aliyun/aliyun-oss-go-sdk/oss

image.png

验证sdk

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    version := oss.Version
    fmt.Println(version)
}

使用Go SDK发起OSS请求,您需要配置访问凭证。阿里云服务会通过访问凭证验证您的身份信息和访问权限。阿里云oss访问权限控制

image.png

秘钥配置在系统环境变量中防止泄露

image.png

package main

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)

func main() {
	// 使用环境变量中获取的RAM用户的访问密钥配置访问凭证。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

oss上传文件的限制

image.png

如果是RAM用户上传的时候还需要服务端权限,且bucket不可为私有。

上传文件包含多种上传方式,一般使用简单上传。简单上传是指通过PutObject方法上传单个文件(Object)。简单上传包括流式上传和文件上传,流式上传使用文件流、网络流等作为OSS文件的数据源,文件上传使用本地文件作为OSS文件的数据源。

    // 依次填写Object的完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径(例如D:\localpath\examplefile.txt)。
    err = bucket.PutObjectFromFile("exampledir/exampleobject.txt", "D:\localpath\examplefile.txt")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

上传字节数组

// 将Byte数组上传至exampledir目录下的exampleobject.txt文件。
err = bucket.PutObject("exampledir/exampleobject.txt", bytes.NewReader([]byte("yourObjectValueByteArrary")))
if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
}

将文件流上传到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件

    // 填写本地文件的完整路径,例如D:\localpath\examplefile.txt。
    fd, err := os.Open("D:\localpath\examplefile.txt")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    defer fd.Close()

    // 将文件流上传至exampledir目录下的exampleobject.txt文件。
    err = bucket.PutObject("exampledir/ledirexampleobject.txt", fd)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

上传网络流,将网络流上传到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件.

    // 填写Object的完整路径,例如exampledir/exampleobject.txt。
    objectname := "exampledir/exampleobject.txt"
    // 指定待上传的网络流。
    res,_ := http.Get("https://www.aliyun.com/")
    
    if err != nil {
    HandleError(err)
    }

    err = bucket.PutObject(objectname, io.Reader(res.Body))

    if err != nil {
    HandleError(err)
    }

更多一移步:阿里云 GO SDK