gpt4 book ai didi

go - 如何在 Go 中将预签名的 POST 上传到 AWS S3?

转载 作者:IT王子 更新时间:2023-10-29 01:21:45 24 4
gpt4 key购买 nike

我想做一个 pre-signed POST to upload files to an AWS S3 bucket - 这将如何在 Go 中完成?

请注意,这与使用 PUT 进行预签名上传不同。

最佳答案

所以为了帮助别人,我会自己回答这个问题,并提供一些代码来帮助其他可能遇到同样问题的人。

可以找到用于 Google App Engine 呈现预签名 POST 表单的示例网络应用 here .

a small library I created doing the pre-signed POST in Go .

简而言之,对公开读取的 Amazon S3 存储桶执行预签名 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。为允许上传的 HTTP POST 创建策略。

AWS S3 docs

示例 POST 策略模板,过期将特定 key 上传到特定存储桶并允许公共(public)读取访问权限。

{ "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 存储桶拥有者的凭据生成并签署政策。

AWS docs

  • 填写到期时间、存储桶、 key 、凭据和日期的正确值。
  • base64 编码策略。
  • HMAC-SHA256 获取签名的策略。
  • 对签名进行十六进制编码。

<强>4。构建并发布多部分表单数据

AWS S3 docs

现在要么生成 HTML 表单并自动获取正确的多部分表单数据请求,如上述链接中所述。

我想在 Go 中手动执行此操作,下面是如何执行此操作。

无论采用哪种方式,您都需要提供在步骤 2 和 3 中创建的 POST 策略中指定的所有部分。除了必填字段(不在策略中)之外,请求中也不能有其他字段。

字段的顺序也是指定的,它们都是 HTTP POST 请求中的多部分字段。

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 - 如何在 Go 中将预签名的 POST 上传到 AWS S3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32377782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com