为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 go-cloud s3blob 设置公共读取?

如何使用 go-cloud s3blob 设置公共读取?

Go
阿波罗的战车 2023-06-01 14:18:52
我遵循了go-cloud 教程,并且成功地将文件写入了我的 S3 存储桶。但是我如何设置 ACL: s3.ObjectCannedACLPublicRead aka public-read aka work readable permissions on that object?!遗憾的是,我的解决方法是为基于 gocloud.dev/blob/s3blob 的项目设置公共存储桶策略。
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

看起来库希望提供者之间的任何不一致都作为BeforeWrite回调提供:


opts := &blob.WriterOptions{}

opts.BeforeWrite(func(i interface{}) bool {

    p, ok := i.(*s3manager.UploadInput)

    if !ok {

        return false

    }

    p.ACL = aws.String("public-read")

    return true

})


w, err := b.NewWriter(ctx, "feeds/index.html", opts)

警告:我完全没有测试这段代码,但它成功了,所以它应该可以工作?


我会警告你,由于这些类型的原因,这个库似乎处于 alpha 阶段。依赖这种变通方法会导致您在尝试为所有云提供商重用它时遇到问题。最后,我建议只使用提供的 SDK 实现您想要的功能,并利用工厂/适配器模式为给定调用检索正确的适配器。


查看完整回答
反对 回复 2023-06-01
?
弑天下

TA贡献1818条经验 获得超8个赞

在桶/容器级别设置 ACL 可能是正确的做法。设置每个 blob ACL 可能难以有效管理。在某些 blob 存储提供商(AWS S3、GCS)上是可能的,但在其他提供商(Azure)上则不行,因此 Go Cloud 尚未添加对它的支持。此外,所有 3 个提供商(和 Go Cloud)都支持“签名 URL”功能,您作为资源的所有者可以创建一个 URL,在有限的时间内提供对其的公共读取访问权限。



查看完整回答
反对 回复 2023-06-01
?
精慕HU

TA贡献1845条经验 获得超8个赞

提供者之间的任何不一致都将作为 BeforeWrite 提供。


b, err := s3blob.OpenBucket(ctx, bucket, s, nil)

    if err != nil {

        return

    }

    before := func(asFunc func(interface{}) bool) error {

        req := &s3manager.UploadInput{}

        ok := asFunc(&req)

        if !ok {

            return errors.New("invalid s3 type")

        }

        req.ACL = aws.String(acl)

        return nil

    }

    w, err := b.NewWriter(ctx, appendTime(fileName), &blob.WriterOptions{

        ContentType: forceContentTypeByExtension(fileName),

        BeforeWrite: before,

    })


查看完整回答
反对 回复 2023-06-01
  • 3 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信