官网SDK文档
策略概述
获取临时密钥
获取临时密钥
coscli的使用
go get -u github.com/tencentyun/cos-go-sdk-v5
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"},
})
}
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,如果是图片可以直接浏览器打开预览,不是下载
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)
}
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
}
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
}