首頁  >  文章  >  後端開發  >  如何在 Go 中實作預簽 POST 上傳到 AWS S3?

如何在 Go 中實作預簽 POST 上傳到 AWS S3?

Linda Hamilton
Linda Hamilton原創
2024-11-24 00:45:14923瀏覽

How to Implement Pre-signed POST Uploads to AWS S3 in Go?

預簽POST 上傳至Go 中的AWS S3:綜合指南

背景

預先簽署POST 上傳允許未經授權的使用者安全上傳文件到S3 儲存桶。與預簽 PUT 不同,此方法依賴基於策略的授權並簡化檔案傳輸。

預先簽署POST 上傳的步驟

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儲存桶擁有者的憑證產生簽章:

  • 填入策略值。
  • 對策略進行 Base64 編碼。
  • HMAC-SHA256 策略。
  • 十六進位編碼簽章。

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
}

資源

  • [AWS S3文件:預-簽POST](https://docs.aws.amazon.com/AmazonS3/latest/userguide/post-object.html)
  • [GitHub:Go 的預簽POST 函式庫](https ://github .com/danlami/presigned-post/tree/main/pkg/presigned)

以上是如何在 Go 中實作預簽 POST 上傳到 AWS S3?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn