| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- package oss
- import (
- "bytes"
- "io"
- "os"
- "strings"
- "time"
- "github.com/aliyun/aliyun-oss-go-sdk/oss"
- )
- var bucket *oss.Bucket
- var ProjectRoot = "webserver"
- // InitOSSClient 初始化OSS鉴权客户端
- func Init() error {
- client, err := oss.New(os.Getenv("OSS_END_POINT"), os.Getenv("OSS_ACCESS_KEY_ID"), os.Getenv("OSS_ACCESS_KEY_SECRET"))
- if err != nil {
- panic("创建oss.Client失败")
- }
- // 获取存储空间。
- obucket, err := client.Bucket(os.Getenv("OSS_BUCKET"))
- if err != nil {
- panic("创建oss.Bucket失败")
- }
- bucket = obucket
- if os.Getenv("ENV_VALUE") == "test" {
- ProjectRoot = "testserver"
- }
- if os.Getenv("ENV_VALUE") == "dev" {
- ProjectRoot = "devserver"
- }
- return nil
- }
- func GetBucket() *oss.Bucket {
- return bucket
- }
- // Put 将文件流保存到指定目录
- func Put(file io.Reader, dst string) error {
- // 凭证有效期
- credentialTTL := 3600
- // 是否允许覆盖
- overwrite := true
- options := []oss.Option{
- oss.Expires(time.Now().Add(time.Duration(credentialTTL) * time.Second)),
- oss.ForbidOverWrite(!overwrite),
- }
- // 上传文件
- err := bucket.PutObject(dst, file, options...)
- if err != nil {
- return err
- }
- return nil
- }
- // Get 读取文件
- func Get(dst string) (*bytes.Buffer, error) {
- // 下载文件到缓存。
- body, err := bucket.GetObject(dst)
- if err != nil {
- return nil, err
- }
- defer body.Close()
- buf := new(bytes.Buffer)
- io.Copy(buf, body)
- return buf, nil
- }
- func Delete(dst []string, options ...oss.Option) (oss.DeleteObjectsResult, error) {
- // 将oss.DeleteObjectsQuiet设置为true,表示不返回删除结果。
- res, err := bucket.DeleteObjects(dst, options...)
- if err != nil {
- return res, err
- }
- return res, nil
- }
- func DeleteBatch(path string) error {
- marker := oss.Marker("")
- // 如果您需要删除所有前缀为src的文件,则prefix设置为src。设置为src后,所有前缀为src的非目录文件、src目录以及目录下的所有文件均会被删除。
- //prefix := oss.Prefix("src")
- // 如果您仅需要删除src目录及目录下的所有文件,则prefix设置为src/。
- dst := path
- if path[len(path)-1] != '/' {
- dst = dst + "/"
- }
- prefix := oss.Prefix(dst)
- lor, err := bucket.ListObjects(marker, prefix)
- if err != nil {
- return err
- }
- objects := []string{}
- for _, object := range lor.Objects {
- objects = append(objects, object.Key)
- }
- // 将oss.DeleteObjectsQuiet设置为true,表示不返回删除结果。
- _, err = Delete(objects, oss.DeleteObjectsQuiet(true))
- if err != nil {
- return err
- }
- return nil
- }
- func SignVideoImageURL(path string, style string) string {
- path = strings.Replace(path, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
- options := []oss.Option{}
- if style != "" {
- options = append(options, oss.Process(style))
- }
- signedGetURL, _ := bucket.SignURL(path, oss.HTTPGet, 600, options...)
- return signedGetURL
- }
- func SignVideoImageURLExpire(path string, style string, expire int64) string {
- path = strings.Replace(path, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
- options := []oss.Option{}
- if style != "" {
- options = append(options, oss.Process(style))
- }
- signedGetURL, _ := bucket.SignURL(path, oss.HTTPGet, expire, options...)
- return signedGetURL
- }
- // AssetsPreviewImageURL 资产缩略图地址
- func SignSourceUrl(path string) string {
- return path
- // 移除 http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/ 前缀
- path = strings.Replace(path, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
- signedGetURL, _ := bucket.SignURL(path, oss.HTTPGet, 600)
- return signedGetURL
- }
- // SignSourceUrlBatch 资产效果图地址
- func SignSourceUrlBatch(path string) []string {
- if path == "" {
- return []string{}
- }
- pathList := strings.Split(path, ",")
- return pathList
- signedGetURL := make([]string, 0, len(pathList))
- if !(len(pathList) == 0 || pathList[0] == "") {
- for _, v := range pathList {
- // 移除 http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/ 前缀
- v = strings.Replace(v, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
- url, _ := bucket.SignURL(v, oss.HTTPGet, 600)
- signedGetURL = append(signedGetURL, url)
- }
- }
- return signedGetURL
- }
- func GetFolderSize(folderPath string) (int64, error) {
- dst := folderPath
- if folderPath[len(folderPath)-1] != '/' {
- dst = dst + "/"
- }
- var totalSize int64
- // 获取指定目录下的所有文件
- marker := oss.Marker("")
- for {
- listObjectsResult, err := bucket.ListObjects(marker, oss.Prefix(dst))
- if err != nil {
- return 0, err
- }
- // 累加文件大小
- for _, object := range listObjectsResult.Objects {
- totalSize += object.Size
- }
- // 遍历子目录
- for _, commonPrefix := range listObjectsResult.CommonPrefixes {
- subFolderName := commonPrefix[len(folderPath):]
- subFolderSize, err := GetFolderSize(subFolderName)
- if err != nil {
- return 0, err
- }
- totalSize += subFolderSize
- }
- // 判断是否还有更多文件需要获取
- if !listObjectsResult.IsTruncated {
- break
- }
- marker = oss.Marker(listObjectsResult.NextMarker)
- }
- return totalSize, nil
- }
|