代码之家  ›  专栏  ›  技术社区  ›  hendry

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

  •  2
  • hendry  · 技术社区  · 5 年前

    我跟踪了 go-cloud tutorial 我已经成功地把一个文件写到了我的S3存储桶中。

    public bucket policy 为了我的 gocloud.dev/blob/s3blob based project .

    3 回复  |  直到 5 年前
        1
  •  3
  •   syntaqx    5 年前

    看起来库希望提供提供者之间不一致的任何内容 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)
    

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

    我要警告你,这个图书馆似乎在阿尔法,因为这些原因。依赖这种解决方法会导致您在尝试为所有云提供商重用它时出现问题。最后,我建议使用提供的sdk实现您想要的功能,并利用Factory/Adapter模式为给定的调用检索正确的适配器。

        2
  •  2
  •   user10913735    5 年前

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

        3
  •  1
  •   Felipe Oliveira    5 年前

    如@syntaqx所说,提供程序之间的任何不一致之处。

    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,
        })