light-core/pkg/myOss/index.go

139 lines
3.9 KiB
Go
Raw Normal View History

2024-12-17 22:28:48 +08:00
package myOss
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"io"
"net/http"
"strings"
)
type Model struct {
Path string
Bucket string
ACLType string
Endpoint string
AccessKeyID string
SecretAccessKey string
StorageClassType string
CdnUrl string
ossClient *oss.Client
ossBucket *oss.Bucket
}
func (t *Model) MustGetOssClient() *oss.Client {
if t.ossClient == nil {
client, err := oss.New(t.Endpoint, t.AccessKeyID, t.SecretAccessKey, oss.Timeout(10, 120))
if err != nil {
panic("function oss.New() Filed, err:" + err.Error())
}
t.ossClient = client
}
return t.ossClient
}
func (t *Model) MustGetDefaultOssBucket() *oss.Bucket {
if t.ossBucket == nil {
client := t.MustGetOssClient()
bucket, err := client.Bucket(t.Bucket)
if err != nil {
panic("function client.Bucket() Filed, err:" + err.Error())
}
t.ossBucket = bucket
}
return t.ossBucket
}
func (t *Model) PutObject(savePath, fileName string, reader io.Reader, contentType string) (*RespPath, error) {
err := t.MustGetDefaultOssBucket().PutObject(
fmt.Sprintf("%s/%s", savePath, fileName),
reader,
oss.ContentType(contentType),
t.GetObjectStorageClass(),
t.GetObjectAcl(),
)
return &RespPath{
Path: savePath,
Name: fileName,
Host: t.CdnUrl,
}, err
}
func (t *Model) MustPutObject(savePath, fileName string, reader io.Reader, contentType string) *RespPath {
p, err := t.PutObject(savePath, fileName, reader, contentType)
if err != nil {
panic(err.Error())
}
return p
}
func (t *Model) GetObjectMeta(key string) (http.Header, error) {
if strings.HasPrefix(key, "/") {
key = strings.TrimLeft(key, "/")
}
return t.MustGetDefaultOssBucket().GetObjectMeta(key)
}
func (t *Model) DeleteObject(key string) error {
// 删除单个文件。objectName表示删除OSS文件时需要指定包含文件后缀在内的完整路径例如abc/efg/123.jpg。
// 如需删除文件夹请将objectName设置为对应的文件夹名称。如果文件夹非空则需要将文件夹下的所有object删除后才能删除该文件夹。
//这里需要处理一下路径,如果第一个是/,要去掉
if strings.HasPrefix(key, "/") {
key = strings.TrimLeft(key, "/")
}
if t.IsFileExist(key) {
return t.MustGetDefaultOssBucket().DeleteObject(key)
}
return fmt.Errorf("文件不存在")
}
func (t *Model) IsFileExist(key string) bool {
if strings.HasPrefix(key, "/") {
key = strings.TrimLeft(key, "/")
}
exist, err := t.MustGetDefaultOssBucket().IsObjectExist(key)
if err != nil {
panic(err.Error())
}
return exist
}
func (t *Model) GetObjectStorageClass() oss.Option {
switch t.StorageClassType { // 根据配置文件进行指定存储类型
case "Standard": // 指定存储类型为标准存储
return oss.ObjectStorageClass(oss.StorageStandard)
case "IA": // 指定存储类型为很少访问存储
return oss.ObjectStorageClass(oss.StorageIA)
case "Archive": // 指定存储类型为归档存储。
return oss.ObjectStorageClass(oss.StorageArchive)
case "ColdArchive": // 指定存储类型为归档存储。
return oss.ObjectStorageClass(oss.StorageColdArchive)
default: // 无匹配结果就是标准存储
return oss.ObjectStorageClass(oss.StorageStandard)
}
}
func (t *Model) GetObjectAcl() oss.Option {
switch t.ACLType { // 根据配置文件进行指定访问权限
case "private": // 指定访问权限为私有读写
return oss.ObjectACL(oss.ACLPrivate) // 指定访问权限为公共读
case "public-read":
return oss.ObjectACL(oss.ACLPublicRead) // 指定访问权限为公共读
case "public-read-write":
return oss.ObjectACL(oss.ACLPublicReadWrite) // 指定访问权限为公共读写
case "default":
return oss.ObjectACL(oss.ACLDefault) // 指定访问权限为公共读
default:
return oss.ObjectACL(oss.ACLPrivate) // 默认为访问权限为公共读
}
}
type RespPath struct {
Path string
Name string
Host string
}