简介
阿里云对象存储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资源。
请准备好访问凭证AccessKeyId、AccessKeySecret.
下载SDKgo get github.com/aliyun/aliyun-oss-go-sdk/oss
验证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访问权限控制
秘钥配置在系统环境变量中防止泄露
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上传文件的限制
如果是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)
}