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 实现您想要的功能,并利用工厂/适配器模式为给定调用检索正确的适配器。
TA贡献1818条经验 获得超8个赞
在桶/容器级别设置 ACL 可能是正确的做法。设置每个 blob ACL 可能难以有效管理。在某些 blob 存储提供商(AWS S3、GCS)上是可能的,但在其他提供商(Azure)上则不行,因此 Go Cloud 尚未添加对它的支持。此外,所有 3 个提供商(和 Go Cloud)都支持“签名 URL”功能,您作为资源的所有者可以创建一个 URL,在有限的时间内提供对其的公共读取访问权限。
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,
})
- 3 回答
- 0 关注
- 138 浏览
添加回答
举报