首页 > 后端开发 > Golang > 正文

如何使用Go实现预签名POST文件上传到AWS S3?

Mary-Kate Olsen
发布: 2024-11-25 06:02:11
原创
619 人浏览过

How to Achieve Pre-signed POST File Uploads to AWS S3 using Go?

预签名 POST 上传到 Go 中的 AWS S3

问题:

如何执行预签名 POST upload 使用 Go 将文件上传到 AWS S3 存储桶,而不使用传统的预签名 PUT方法?

解决方案:

要执行预签名 POST 上传,请按照以下步骤操作:

  1. 配置 S3公开下载的存储桶: 设置存储桶策略以允许公开下载仅。
  2. 创建 POST 策略:生成允许上传到特定密钥、存储桶并授予公共读取访问权限的 POST 策略。
  3. 生成并签署策略: 使用 S3 存储桶所有者的凭据生成并签署 POST 策略,将其编码为 base64 并十六进制。
  4. 构造并发布多部分表单数据: 使用以下字段创建多部分表单数据请求:

    • (key) 的名称要上传的文件
    • (策略)base64 编码的 POST策略
    • (signature) 策略的十六进制编码签名
    • (x-amz-credential) 用于签署策略
    • (x-amz-算法)用于签署策略的算法(AWS4-HMAC-SHA256)
    • (x-amz-date) 用于签署策略的日期

Go 中的示例代码:

import (
    "bytes"
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "strings"
)

// Fields represents the fields to be uploaded in the multipart form data request.
type Fields struct {
    Key, Value string
}

// Upload performs a Pre-signed POST upload using the provided URL and fields.
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 := io.WriteString(fw, 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中文网其他相关文章!

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