概述
OSS的內建上傳和下載下傳提供了SDK可以直接使用,但實際使用中一些使用者受限環境或者裝置限制需要使用api方式來實作上傳和下載下傳,本文以PutObject接口為例,提供了GoLang實作的demo。
注:建議優先使用OSS提供SDK,本文提供的隻是簽名實作上傳demo,實際使用中需要結合業務來進行改動代碼
詳細資訊
PutObject實作demo(測試環境go1.7.6):
package main
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"io/ioutil"
"net/http"
"strings"
"time"
)
func main() {
bucketname := "bucket名稱"
endpoint := "oss-cn-hangzhou.aliyuncs.com"
objectname := "mytest/go.txt" //存儲路徑
accesskey := "xx" //您的Accesskey
accesskeysecret := "xx" //您的Accesskeysecret
contenttype := "application/json"
gmtdate := time.Now().UTC().Format(http.TimeFormat)
stringtosgin := "PUT\n\n" + contenttype + "\n" + gmtdate + "\n" + "/" + bucketname + "/" + objectname
// HMACSHA1 實作部分
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[Server:[AliyunOSS] Date:[Thu, 09 Apr 2020 09:16:47 GMT] Content-Length:[0] Connection:[keep-alive] X-Oss-Request-Id:[5E8EE7FF990C633330489D8D] Etag:["04114792F189E2CED819A7229B699B0A"] X-Oss-Hash-Crc64ecma:[13429510132257231065] Content-Md5:[BBFHkvGJ4s7YGacim2mbCg==] X-Oss-Server-Time:[92]] 0x71d940 0 [] false false map[] 0xc0420c20f0 <nil>}