golang---腾讯云COS对象存储V5(图片)操作

官网SDK文档
策略概述
获取临时密钥
获取临时密钥

安装使用Coscli工具

coscli的使用

导入库

go get -u github.com/tencentyun/cos-go-sdk-v5

初始化cos对象

package global

import (
	"os"
	"github.com/tencentyun/cos-go-sdk-v5"
)

var (
	Mode       string
	CosClient  *cos.Client
)

func init() {
	Mode = os.Getenv("MODE")
}

package initialization

import (
	"net/http"
	"net/url"

	"mcs/mpbackend/global"

	"github.com/tencentyun/cos-go-sdk-v5"
)

func GetCosClient() {
	u, _ := url.Parse("https://examplebucket-1250000000.cos.COS_REGION.myqcloud.com")
	b := &cos.BaseURL{BucketURL: u}
	global.CosClient = cos.NewClient(b, &http.Client{
		Transport: &cos.AuthorizationTransport{SecretID: "SECRETID", SecretKey: "SECRETKEY"},
	})
}

操作COS

下载对象(GetObject)

package service

import (
	"context"
	"fmt"
	"net/http"
	"net/url"
	"path/filepath"
	"time"

	"mcs/mpbackend/global"
	"mcs/mpbackend/utils"

	"github.com/tencentyun/cos-go-sdk-v5"
	sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
)
type cosService struct{}

func (cs *cosService) GetObject(fileFullPath, downloadPath string) error {
	opt := &cos.MultiDownloadOptions{
		ThreadPoolSize: 5,
	}
	dir := filepath.Dir(downloadPath)
	err := utils.CreateDir(dir)
	if err != nil {
		fmt.Println("文件夹创建失败:", err)
		return err
	}
	_, err = global.CosClient.Object.Download(context.Background(), fileFullPath, downloadPath, opt)
	if err != nil {
		fmt.Println("cos 对象获取失败:", err)
	}
	return err
}

获取对象的预签名URL(GetObjectPresignedURL)

得到的URL,如果是图片可以直接浏览器打开预览,不是下载

package service

import (
	"context"
	"fmt"
	"net/http"
	"net/url"
	"path/filepath"
	"time"

	"mcs/mpbackend/global"
	"mcs/mpbackend/utils"

	"github.com/tencentyun/cos-go-sdk-v5"
	sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
)

type cosService struct{}


func (cs *cosService) GetObjectPresignedURL(fileFullPath string) string {
	credentials := cs.getTempKey(fileFullPath) //获取临时签名
	//这里如果是临时密钥,那么得到的就是临时签名URL,并且要使用返回的临时token
	//这里如果是永久密钥,那么得到的就是永久签名URL,token可以自己决定生成
	secretId := credentials.TmpSecretID
	secretKey := credentials.TmpSecretKey
	ctx := context.Background()

	// 方法1 通过 PresignedURLOptions 设置 x-cos-security-token
	// PresignedURLOptions 提供用户添加请求参数和请求头部
	opt := &cos.PresignedURLOptions{
		Query:  &url.Values{},
		Header: &http.Header{},
	}
	opt.Query.Add("x-cos-security-token", credentials.SessionToken)
	// 获取预签名
	presignedURL, err := global.CosClient.Object.GetPresignedURL(ctx, http.MethodGet, fileFullPath, secretId, secretKey, time.Hour, opt)
	if err != nil {
		fmt.Printf("GetPresignedURL Error: %v\n", err)
		return ""
	}
	// 通过预签名访问对象
	// resp, err := http.Get(presignedURL.String())
	// if err != nil {
	// 	fmt.Printf("Error: %v\n", err)
	// }
	// defer resp.Body.Close()
	fmt.Println(presignedURL.String())
	return presignedURL.String()
	// fmt.Printf("resp:%v\n", resp)
}

获取临时签名(getTempKey)

package service

import (
	"context"
	"fmt"
	"net/http"
	"net/url"
	"path/filepath"
	"time"

	"mcs/mpbackend/global"
	"mcs/mpbackend/utils"

	"github.com/tencentyun/cos-go-sdk-v5"
	sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
)

type cosService struct{}

// 获取临时secretId和secretKey
func (cs *cosService) getTempKey(fileFullPath string) *sts.Credentials {
	appid := "1250000000"
	bucket := "examplebucket-1250000000"
	secretId := "永久SECRETID"
	secretKey := "永久SECRETKEY"
	c := sts.NewClient(
		secretId,
		secretKey,
		nil,
	)
	opt := &sts.CredentialOptions{
		DurationSeconds: int64(time.Hour.Seconds()),
		Region:          "ap-guangzhou",
		Policy: &sts.CredentialPolicy{
			Statement: []sts.CredentialPolicyStatement{
				{
					// 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
					Action: []string{
						// 下载操作
						"name/cos:GetObject",
					},
					Effect: "allow",
					Resource: []string{
						// 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
						// 存储桶的命名格式为 BucketName-APPID,此处填写的 bucket 必须为此格式,下方文件夹前面最好写为/test/*,而不是test/*
						"qcs::cos:ap-guangzhou:uid/" + appid + ":" + bucket + "/test/*",
					},
				},
			},
		},
	}
	res, err := c.GetCredential(opt)
	if err != nil {
		fmt.Printf("为%s获取临时密钥失败%s\n", fileFullPath, err)
		return nil
	}
	// fmt.Printf("%+v",res.Credentials)
	return res.Credentials
}

获取对象列表(GetObejctList)

package service

import (
	"context"
	"fmt"
	"net/http"
	"net/url"
	"path/filepath"
	"time"

	"mcs/mpbackend/global"
	"mcs/mpbackend/utils"

	"github.com/tencentyun/cos-go-sdk-v5"
	sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
)

type cosService struct{}

func (cs *cosService) GetObejctList(sn string) []cos.Object {
	var marker string
	var result []cos.Object
	prefix := "test/"

	opt := &cos.BucketGetOptions{
		Prefix:    prefix, // prefix表示要查询的文件夹
		Delimiter: "/",    // deliter表示分隔符, 设置为/表示列出当前目录下的object, 设置为空表示列出所有的object
		MaxKeys:   1000,   // 设置最大遍历出多少个对象, 一次listobject最大支持1000
	}
	isTruncated := true
	for isTruncated {
		opt.Marker = marker
		v, _, err := global.CosClient.Bucket.Get(context.Background(), opt)
		if err != nil {
			fmt.Println("Bucket.Get ERR =", err)
			break
		}
		result = append(result, v.Contents...)
		// for _, content := range v.Contents {
		// 	fmt.Printf("get object: %v\n", content)
		// }
		// common prefix表示表示被delimiter截断的路径, 如delimter设置为/, common prefix则表示所有子目录的路径
		// for _, commonPrefix := range v.CommonPrefixes {
		// 	fmt.Printf("CommonPrefixes: %v\n", commonPrefix)
		// }
		isTruncated = v.IsTruncated // 是否还有数据
		marker = v.NextMarker       // 设置下次请求的起始 key
		fmt.Println("---", marker)
	}
	return result
}

你可能感兴趣的:(Golang,golang,腾讯云)