本文介绍如何使用Go SDK以签名Header的方式上传文件。
示例代码
以下以Go SDK 1.7.6版本为例,说明如何通过签名Header的方式上传文件。
package main
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
"time"
)
func main() {
// 填写Bucket名称,例如examplebucket。
bucketname := "examplebucket"
// 填写Bucket的外网访问Endpoint。
endpoint := "oss-cn-hangzhou.aliyuncs.com"
// 指定上传至Bucket中Object的完整路径,完整路径中不能包含Bucket名称。
objectname := "examplefile.txt"
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accesskey := os.Getenv("OSS_ACCESS_KEY_ID")
accesskeysecret := os.Getenv("OSS_ACCESS_KEY_SECRET")
contenttype := "application/json"
gmtdate := time.Now().UTC().Format(http.TimeFormat)
stringtosgin := "PUT\n\n" + contenttype + "\n" + gmtdate + "\n" + "/" + bucketname + "/" + objectname
key := []byte(accesskeysecret)
mac := hmac.New(sha1.New, key)
mac.Write([]byte(stringtosgin))
// Base64编码。
signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))
url := "http://" + bucketname + "." + endpoint + "/" + objectname
payload := strings.NewReader("{go:test}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", contenttype)
req.Header.Add("Authorization", "OSS "+accesskey+":"+signature)
req.Header.Add("Date", gmtdate)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
输出结果如下。
&{200 OK 200 HTTP/1.1 1 1 map[Connection:[keep-alive] Content-Length:[0] Content-Md5:[BBFHkvGJ4s7YGacim2mbCg==] Date:[Thu, 14 Sep 2023 09:28:19 GMT] Etag:["04114792F189E2CED819A7229B69****"] Server:[AliyunOSS] X-Oss-Hash-Crc64ecma:[1342951013225723****] X-Oss-Request-Id:[6502D233818A31353126****] X-Oss-Server-Time:[126]] {} 0 [] false false map[] 0xc000134000 <nil>}
相关文档
文档内容是否对您有帮助?