对象存储服务 OBS-生成带授权信息的表单上传参数(Go SDK):代码样例

时间:2023-11-24 16:32:52

代码样例

本示例用于生成POST上传对象的带授权信息的URL。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main
import (
    "fmt"
    "os"
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)
func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    // securityToken := os.Getenv("SecurityToken")
   // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 创建obsClient实例
    // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
    obsClient, err := obs.New(ak, sk, endPoint/*, obs.WithSecurityToken(securityToken)*/)
    if err != nil {
        fmt.Printf("Create obsClient error, errMsg: %s", err.Error())
    }
    // 生成上传对象的带授权信息的URL
    input := &obs.CreateBrowserBasedSignatureInput{}
    input.Bucket = "examplebucket"
    input.Key = "example/objectname"
    input.FormParams = map[string]string{
        "content-type": "text/plain",
        "success_action_redirect": "https://www.example.com",
    }
    output, err := obsClient.CreateBrowserBasedSignature(input)
if err == nil {
        fmt.Printf("Policy:%s\n", output.Policy)
        fmt.Printf("Signature:%s\n", output.Signature)
    } else {
        fmt.Println(err)
        return
    }
    requestBody := &bytes.Buffer{}
    writer := multipart.NewWriter(requestBody)
    writer.WriteField("key", input.Key)
    writer.WriteField("AccessKeyId", ak)
    writer.WriteField("policy", output.Policy)
    writer.WriteField("signature", output.Signature)
    writer.WriteField("success_action_redirect", "https://www.example.com")
    // writer.WriteField("token", obs.WithSecurityToken(securityToken))
    writer.WriteField("Content-Type", "text/plain")
    formFile, _ := writer.CreateFormFile("file", "filename")
    io.Copy(formFile, strings.NewReader("hello OBS!"))
    writer.Close()
    url := "https://" + input.Bucket + "." + strings.Replace(endPoint, "https://", "", 1)
    request, err := http.NewRequest("POST", url, requestBody)
    if err != nil {
        fmt.Println(err)
        return
    }
    request.Header.Set("Content-Type", writer.FormDataContentType())
    client := &http.Client{}
    response, err := client.Do(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer response.Body.Close()
    if err == nil {
        fmt.Printf("Use signed-url successful!\n")
        fmt.Printf("Status:%s,Etag:%s\n", response.Status, response.Header.Get("Etag"))
        return
    }
    fmt.Printf("Use signed-url successful!\n")
    fmt.Println("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.")
    fmt.Println(err)
}
support.huaweicloud.com/sdk-go-devg-obs/obs_33_0602.html