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

我遵循了go-cloud 教程,并且成功地将文件写入了我的 S3 存储桶。

但是我如何设置 ACL: s3.ObjectCannedACLPublicRead aka public-read aka work readable permissions on that object?!

遗憾的是,我的解决方法是为基于 gocloud.dev/blob/s3blob 的项目设置公共存储桶策略。


阿波罗的战车
浏览 139回答 3
3回答

湖上湖

看起来库希望提供者之间的任何不一致都作为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 实现您想要的功能,并利用工厂/适配器模式为给定调用检索正确的适配器。

弑天下

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

精慕HU

提供者之间的任何不一致都将作为 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,    })
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go