presigned url, and demo
This commit is contained in:
65
example/object/getByPresignedURL.go
Normal file
65
example/object/getByPresignedURL.go
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
|
"bytes"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/tencentyun/cos-go-sdk-v5"
|
||||||
|
"github.com/tencentyun/cos-go-sdk-v5/debug"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ak := os.Getenv("COS_SECRETID")
|
||||||
|
sk := os.Getenv("COS_SECRETKEY")
|
||||||
|
u, _ := url.Parse("https://test-1253846586.cos.ap-guangzhou.myqcloud.com")
|
||||||
|
b := &cos.BaseURL{BucketURL: u}
|
||||||
|
c := cos.NewClient(b, &http.Client{
|
||||||
|
Transport: &cos.AuthorizationTransport{
|
||||||
|
SecretID: ak,
|
||||||
|
SecretKey: sk,
|
||||||
|
Expire: time.Hour,
|
||||||
|
Transport: &debug.DebugRequestTransport{
|
||||||
|
RequestHeader: true,
|
||||||
|
RequestBody: true,
|
||||||
|
ResponseHeader: true,
|
||||||
|
ResponseBody: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
name := "test"
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
// Normal header way to get object
|
||||||
|
resp, err := c.Object.Get(ctx, name, nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
bs, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
resp.Body.Close()
|
||||||
|
|
||||||
|
// Get presigned
|
||||||
|
presignedURL, err := c.Object.GetPresignedURL(ctx, http.MethodGet, name, ak, sk, time.Hour, nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// Get object by presinged url
|
||||||
|
resp2, err := http.Get(presignedURL.String())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
bs2, _ := ioutil.ReadAll(resp2.Body)
|
||||||
|
resp2.Body.Close()
|
||||||
|
fmt.Printf("result2 is : %s\n", string(bs2))
|
||||||
|
|
||||||
|
fmt.Printf("%v\n\n", bytes.Compare(bs2, bs) == 0)
|
||||||
|
|
||||||
|
}
|
||||||
42
object.go
42
object.go
@@ -7,8 +7,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ObjectService 相关 API
|
// ObjectService 相关 API
|
||||||
@@ -26,6 +28,11 @@ type ObjectGetOptions struct {
|
|||||||
IfModifiedSince string `url:"-" header:"If-Modified-Since,omitempty"`
|
IfModifiedSince string `url:"-" header:"If-Modified-Since,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// presignedURLTestingOptions is the opt of presigned url
|
||||||
|
type presignedURLTestingOptions struct {
|
||||||
|
authTime *AuthTime
|
||||||
|
}
|
||||||
|
|
||||||
// Get Object 请求可以将一个文件(Object)下载至本地。
|
// Get Object 请求可以将一个文件(Object)下载至本地。
|
||||||
// 该操作需要对目标 Object 具有读权限或目标 Object 对所有人都开放了读权限(公有读)。
|
// 该操作需要对目标 Object 具有读权限或目标 Object 对所有人都开放了读权限(公有读)。
|
||||||
//
|
//
|
||||||
@@ -66,6 +73,41 @@ func (s *ObjectService) GetToFile(ctx context.Context, name, localpath string, o
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetPresignedURL get the object presigned to down or upload file by url
|
||||||
|
func (s *ObjectService) GetPresignedURL(ctx context.Context, httpMethod, name, ak, sk string, expired time.Duration, opt interface{}) (*url.URL, error) {
|
||||||
|
sendOpt := sendOptions{
|
||||||
|
baseURL: s.client.BaseURL.BucketURL,
|
||||||
|
uri: "/" + encodeURIComponent(name),
|
||||||
|
method: httpMethod,
|
||||||
|
optQuery: opt,
|
||||||
|
optHeader: opt,
|
||||||
|
}
|
||||||
|
req, err := s.client.newRequest(ctx, sendOpt.baseURL, sendOpt.uri, sendOpt.method, sendOpt.body, sendOpt.optQuery, sendOpt.optHeader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var authTime *AuthTime
|
||||||
|
if opt != nil {
|
||||||
|
if opt, ok := opt.(*presignedURLTestingOptions); ok {
|
||||||
|
authTime = opt.authTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if authTime == nil {
|
||||||
|
authTime = NewAuthTime(expired)
|
||||||
|
}
|
||||||
|
authorization := newAuthorization(ak, sk, req, authTime)
|
||||||
|
sign := encodeURIComponent(authorization)
|
||||||
|
|
||||||
|
if req.URL.RawQuery == "" {
|
||||||
|
req.URL.RawQuery = fmt.Sprintf("sign=%s", sign)
|
||||||
|
} else {
|
||||||
|
req.URL.RawQuery = fmt.Sprintf("%s&sign=%s", req.URL.RawQuery, sign)
|
||||||
|
}
|
||||||
|
return req.URL, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// ObjectPutHeaderOptions the options of header of the put object
|
// ObjectPutHeaderOptions the options of header of the put object
|
||||||
type ObjectPutHeaderOptions struct {
|
type ObjectPutHeaderOptions struct {
|
||||||
CacheControl string `header:"Cache-Control,omitempty" url:"-"`
|
CacheControl string `header:"Cache-Control,omitempty" url:"-"`
|
||||||
|
|||||||
Reference in New Issue
Block a user