in sample/post_object.go [36:153]
func main() {
flag.Parse()
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
credentialsProvider := credentials.NewEnvironmentVariableCredentialsProvider()
cred, err := credentialsProvider.GetCredentials(context.TODO())
if err != nil {
log.Fatalf("GetCredentials fail, err:%v", err)
}
content := "hi oss"
// build policy
utcTime := time.Now().UTC()
date := utcTime.Format("20060102")
expiration := utcTime.Add(1 * time.Hour)
policyMap := map[string]any{
"expiration": expiration.Format("2006-01-02T15:04:05.000Z"),
"conditions": []any{
map[string]string{"bucket": bucketName},
map[string]string{"x-oss-signature-version": "OSS4-HMAC-SHA256"},
map[string]string{"x-oss-credential": fmt.Sprintf("%v/%v/%v/%v/aliyun_v4_request",
cred.AccessKeyID, date, region, product)},
map[string]string{"x-oss-date": utcTime.Format("20060102T150405Z")},
//other condition
[]any{"content-length-range", 1, 1024},
//[]any{"eq", "$success_action_status", "201"},
//[]any{"starts-with", "$key", "user/eric/"},
//[]any{"in", "$content-type", []string{"image/jpg", "image/png"}},
//[]any{"not-in", "$cache-control", []string{"no-cache"}},
},
}
policy, err := json.Marshal(policyMap)
if err != nil {
log.Fatalf("json.Marshal fail, err:%v", err)
}
// sign policy
stringToSign := base64.StdEncoding.EncodeToString([]byte(policy))
// signing key
hmacHash := func() hash.Hash { return sha256.New() }
signingKey := "aliyun_v4" + cred.AccessKeySecret
h1 := hmac.New(hmacHash, []byte(signingKey))
io.WriteString(h1, date)
h1Key := h1.Sum(nil)
h2 := hmac.New(hmacHash, h1Key)
io.WriteString(h2, region)
h2Key := h2.Sum(nil)
h3 := hmac.New(hmacHash, h2Key)
io.WriteString(h3, product)
h3Key := h3.Sum(nil)
h4 := hmac.New(hmacHash, h3Key)
io.WriteString(h4, "aliyun_v4_request")
h4Key := h4.Sum(nil)
// Signature
h := hmac.New(hmacHash, h4Key)
io.WriteString(h, stringToSign)
signature := hex.EncodeToString(h.Sum(nil))
// Post Request
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
// object info, key & metadata
bodyWriter.WriteField("key", objectName)
// meta-data
//bodyWriter.WriteField("x-oss-", value)
// Policy
bodyWriter.WriteField("policy", stringToSign)
// Signature
bodyWriter.WriteField("x-oss-signature-version", "OSS4-HMAC-SHA256")
bodyWriter.WriteField("x-oss-credential", fmt.Sprintf("%v/%v/%v/%v/aliyun_v4_request", cred.AccessKeyID, date, region, product))
bodyWriter.WriteField("x-oss-date", utcTime.Format("20060102T150405Z"))
bodyWriter.WriteField("x-oss-signature", signature)
// Data
w, _ := bodyWriter.CreateFormField("file")
w.Write([]byte(content))
bodyWriter.Close()
req, _ := http.NewRequest("POST", fmt.Sprintf("http://%v.oss-%v.aliyuncs.com/", bucketName, region), bodyBuf)
req.Header.Set("Content-Type", bodyWriter.FormDataContentType())
req.WithContext(context.Background())
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatalf("Do fail, err:%v", err)
}
defer resp.Body.Close()
if resp.StatusCode/100 != 2 {
log.Fatalf("Post Object Fail, status code:%v, reson:%v", resp.StatusCode, resp.Status)
}
log.Printf("post object done, status code:%v, request id:%v\n", resp.StatusCode, resp.Header.Get("X-Oss-Request-Id"))
}