我遵循了go-cloud 教程,并设法将文件写入我的 S3 存储桶。
但是我如何设置 ACL: s3.ObjectCannedACLPublicRead aka public-read aka 对该对象的工作可读权限?!
遗憾的是,我的解决方法是为基于 gocloud.dev/blob/s3blob 的项目设置公共存储桶策略。
我遵循了go-cloud 教程,并设法将文件写入我的 S3 存储桶。
但是我如何设置 ACL: s3.ObjectCannedACLPublicRead aka public-read aka 对该对象的工作可读权限?!
遗憾的是,我的解决方法是为基于 gocloud.dev/blob/s3blob 的项目设置公共存储桶策略。
看起来库希望提供者之间的任何不一致都作为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 可能是正确的做法。设置 per-blob ACL 可能难以有效管理。在某些 blob 存储提供商(AWS S3、GCS)上是可能的,但在其他(Azure)上是可能的,因此 Go Cloud 没有添加对它的支持。此外,所有 3 个提供程序(和 Go Cloud)都支持“签名 URL”功能,您作为资源的所有者可以创建一个 URL,在有限的时间内提供对其的公共读取访问权限。
正如@syntaqx 所说,提供者之间的任何不一致都将作为 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,
})