为什么要使用OSS?应用场景是什么?
最近在开发考试系统,里面需要上传课件,课件包括pdf,map等等各种类型的文件,这些文件不能像图片一样,直接上传到项目目录下面,需要单独存放,阿里云就提供了存储方式,然后OSS是其中的一种,可以用来存储一些文件。
我们需要登录阿里云,之前一直使用的是阿里云的ESC,一个轻量级的服务器,我现在理解的是,OSS和ESC是阿里云开发的不同的功能。ESC就是我们平常使用的服务器,然后OSS则是用于云存储。
知道上述大体概念之后,我们开始入门OSS,可以看官方推荐的新手入门视频OSS阿里云_ OSS是什么意思_对象储存OSS_阿里云OSS学习路径图_OSS Learning Path - 阿里云 (aliyun.com)
视频中分为四步:开通OSS;创建Bucker存储空间;手动上传文件;下载和分享文件;
上面是直接把自己电脑的本地文件上传到OSS,对于能够登陆OSS控制台的人才能够完成,但是项目中的需求是让每一位老师都能自己上传自己电脑本地的文件到OSS中,那应该如何做呢?
我们使用的是Golang中的Gin框架开发,所以去找官方网站上面的OSS有关Golang的SDK,链接:简介 (aliyun.com)
一:前期准备
我们已经开通过了OSS服务,所以我们接下来需要创建一个AccessKey
AccessKey包括AccessKey ID和AccessKey Secret。
-
AccessKey ID:用于标识用户。
-
AccessKey Secret:用于验证用户的密钥。AccessKey Secret必须保密。
AccessKey就是登陆凭证,能够让我们使用Golang达到类似网页登陆的效果,能够操控OSS。
创建AccessKey
官方文档上面建议给AMP用户创建AccessKey,不建议给阿里云主用户创建,什么是AMP用户呢?我也不清楚,后面再说。
创建RAM用户的AccessKey
如果没有RAM用户的话,根据操作创建一个就行,操作参考链接:创建AccessKey (aliyun.com)
创建完成后注意要给对应用户开放权限,不然后续的初始化会出现问题。
二:初始化Client(具体Golang实现)
Client是OSS的Go客户端,用于管理存储空间和文件等OSS资源。
新建Client时,需要指定Endpoint。有关Endpoint的更多信息,请参见访问域名和数据中心和自定义访问域名。
找到对应的Endpoint,然后再填写之前的AccessKeyId即可。
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
fmt.Println("OSS Go SDK Version: ", oss.Version)
client, err := oss.New("xxx", "xxx", "xxx")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
//列举所有的存储空间
marker := ""
for {
lsRes, err := client.ListBuckets(oss.Marker(marker))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 默认情况下一次返回100条记录。
for _, bucket := range lsRes.Buckets {
fmt.Println("Bucket: ", bucket.Name)
}
if lsRes.IsTruncated {
marker = lsRes.NextMarker
} else {
break
}
}
//判断存储空间是否存在
//yourBucketName存储空间名称
BucketName := "testyjp"
isExist, err := client.IsBucketExist(BucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("IsBucketExist result : ", isExist)
//文件上传,文件上传有简单上传,追加上传,断点续传上传,分片上传
if !isExist {
os.Exit(-1)
}
bucket, err := client.Bucket(BucketName) //注意此处不要写错,写错的话,err让然是nil,我们应该需要先判断一下是否存在
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
err = bucket.PutObjectFromFile("exampledir/产品经理必懂的技术那点事儿 (唐韧) (z-lib.org).pdf", "E:\\产品经理必懂的技术那点事儿 (唐韧) (z-lib.org).pdf")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
至此,上传成功。上面只是一个简单的小demo,但是大概梳理通了整体逻辑,后续项目的操作都需要在此基础上进行。