首页 > 后端开发 > Golang > 如何使用 Go 执行预签名 POST 上传到 AWS S3?

如何使用 Go 执行预签名 POST 上传到 AWS S3?

Linda Hamilton
发布: 2024-11-23 01:01:14
原创
416 人浏览过

How to Perform a Pre-signed POST Upload to AWS S3 using Go?

在 Go 中执行预签名 POST 上传到 AWS S3

在本指南中,我们将深入研究执行预签名的细节- 使用 Go 签名 POST 上传到 AWS S3 存储桶。此方法不同于涉及 PUT 的更常见的预签名上传机制。

先决条件:

  1. 通过设置适当的bucket策略。
  2. 构造一个允许文件上传的POST策略,指定bucket、key、过期时间、访问控制列表 (ACL) 和其他必要的参数。
  3. 使用 S3 存储桶所有者的凭据生成并签署 POST 策略。这涉及到base64编码、HMAC-SHA256哈希计算和十六进制编码。

多部分表单数据构造和POST请求:

要启动上传,请准备包含策略中指定的所有字段的多部分表单数据请求,包括签名的策略文档、密钥和文件内容。使用多部分包的 CreateFormField 方法创建每个表单字段。

代码示例:

以下 Go 代码片段概述了该过程:

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
}
登录后复制

按照以下步骤,您可以使用预签名 POST 方法将文件无缝上传到 AWS S3 存储桶走吧。

以上是如何使用 Go 执行预签名 POST 上传到 AWS S3?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板