一、什么是OSS?
OSS指的是对象存储服务,是一种用于存储和检索大量非结构化数据(例如图片、视频等)的云计算服务。OSS提供了高可用性、可扩展性和安全性,并且可以通过互联网进行访问。
对象存储服务通常以存储桶(Bucket)和对象(Object)的形式组织数据。存储桶是存储的容器,类似于文件夹,而对象是存储的实际数据,可以是任意类型的文件或数据。
二、那如何用oss呢?
2.1 去oss中创建一个Bucker存储空间
先去控制台中找到对象存储oss
进入到Bucket列表中
开始自定义创建一个新的 Bucket列表
2.2 创建AccessKey
接着去创建AccessKey用于后期上传图片的时候,进行身份验证
进入后创建一个新的AccessKey,一定要保存好对应的accessKeySecret
,因为这个值只有在创建的时候能看见!!!
2.3 初始化Client,实现文件上传
前期工作都准备好了,现在就可以开始写代码了
2.3.1 先创建一个OSS客户端
client, err := oss.New(endpoint, accessKeyID, accessKeySecret)
if err != nil {
fmt.Println("Error:", err)
return
}
2.3.2 获取到存储空间
也就是要获取到你的Bucket列表
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
return
}
2.3.3 上传文件
里面两个参数:第一个是文件的路径,第二个是文件的信息
err = bucket.PutObject(objectKey, imginfor)
if err != nil {
fmt.Println("Error:", err)
return
}
2.3.4 获取文件访问链接
第一个参数:图片链接
第三个参数:过期时间
signedURL, err := bucket.SignURL(objectKey, oss.HTTPGet, 31536000000)
if err != nil {
fmt.Println(err.Error())
}
2.3.5 完整实现过程
上面的几步是核心流程,但是在实际处理中肯定还要有一些小细节要处理,比如创建新的文件夹存储,文件重命名等信息
下面展示一下,我实现的完整流程。
func main() {
r := gin.Default()
r.POST("index", func(context *gin.Context) {
form, _ := context.MultipartForm() // 将请求体中 multipart/form-data 格式的数据解析为一个对象
files := form.File["name"] // 获取对象中名为 name 的所有文件
for _, file := range files {
imgname := file.Filename
imgtypes := strings.Split(imgname, ".")
imgtype := imgtypes[len(imgtypes)-1]
newimg := imgName() + imgtype
upload(newimg, file)
}
})
r.Run(":8080")
}
func upload(filename string, s1 *multipart.FileHeader) {
// 配置 OSS 访问信息
accessKeyID := "LTA***"
accessKeySecret := "ijKO6***"
endpoint := "oss***" // 你的OSS服务访问域名
bucketName := "***"
// 创建 OSS 客户端
client, err := oss.New(endpoint, accessKeyID, accessKeySecret)
if err != nil {
fmt.Println("Error:", err)
return
}
// 获取存储空间
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
return
}
// 构建年月日文件夹路径
today := time.Now().Format("20060102") // 格式化为年月日
objectKey := today + "/" + filename
// 检查文件夹是否存在,不存在则创建
isExist, err := bucket.IsObjectExist(today + "/")
if err != nil {
fmt.Println("Error:", err)
return
}
if !isExist {
err := bucket.PutObject(today+"/", strings.NewReader(""))
if err != nil {
fmt.Println("Error:", err)
return
}
}
imginfor, err := s1.Open()
if err != nil {
fmt.Println(err.Error())
return
}
// 上传图片
err = bucket.PutObject(objectKey, imginfor)
if err != nil {
fmt.Println("Error:", err)
return
}
// 生成永久有效的访问链接
signedURL, err := bucket.SignURL(objectKey, oss.HTTPGet, 31536000000)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(signedURL)
fmt.Println("Upload success!")
}
func imgName() string {
// 获取当前时间的纳秒部分
nano := time.Now().UnixNano()
// 生成随机数种子
rand.Seed(time.Now().UnixNano())
// 生成随机数
randomNum := rand.Intn(10000)
// 构建唯一文件名
fileName := fmt.Sprintf("%d_%d", nano, randomNum)
return fileName + "."
}
三、为什么要用oss呢?
1. 低成本:相比传统的我们把文件资源直接存储到项目的目录下,如果资源过多,会占用大量的空间,项目如果要迁移,每次还要把这些大量的文件一同迁移走。如果采用oss存储,存储一次后,保存路径,后期随时可调用。
2. 安全性:oss存储数据也相对很安全,oss提供数据加密、访问控制和身份验证登安全功能,保护了数据的机密性和安全性。
3. 可扩展性:oss具有无限的扩展性,能存储大规模数据,而传统的文件系统可能会受到存储容量的限制。