預先簽署POST 上傳允許未經授權的使用者安全上傳文件到S3 儲存桶。與預簽 PUT 不同,此方法依賴基於策略的授權並簡化檔案傳輸。
1.設定S3 儲存桶的公共讀取存取權限:
設定下列儲存桶策略以啟用公共讀取存取權限:
{ "Version": "2012-10-17", "Id": "akjsdhakshfjlashdf", "Statement": [ { "Sid": "kjahsdkajhsdkjasda", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKETNAMEHERE/*" } ] }
2.產生POST策略:
建立POST 策略模板,填寫關鍵欄位(過期、儲存桶、金鑰、憑證、日期),並進行編碼:
{ "expiration": "%s", "conditions": [ {"bucket": "%s"}, ["starts-with", "$key", "%s"], {"acl": "public-read"}, {"x-amz-credential": "%s"}, {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, {"x-amz-date": "%s" } ] }
3.簽署策略:
使用S3儲存桶擁有者的憑證產生簽章:
4.建立多部分錶單資料:
在多部分錶單資料中包含所有策略參數:
func Upload(url string, fields Fields) error { var b bytes.Buffer w := multipart.NewWriter(&b) for _, f := range fields { fw, err := w.CreateFormField(f.Key) if err != nil { return err } if _, err := fw.Write([]byte(f.Value)); err != nil { return err } } w.Close() req, err := http.NewRequest("POST", url, &b) if err != nil { return err } req.Header.Set("Content-Type", w.FormDataContentType()) client := &http.Client{} res, err := client.Do(req) if err != nil { return err } if res.StatusCode != http.StatusOK { err = fmt.Errorf("bad status: %s", res.Status) } return nil }
以上是如何在 Go 中實作預簽 POST 上傳到 AWS S3?的詳細內容。更多資訊請關注PHP中文網其他相關文章!