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 關注
- 174 瀏覽
添加回答
舉報