为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中使用带有自定义标头的 gcp 签名 url

如何在 Go 中使用带有自定义标头的 gcp 签名 url

Go
catspeake 2022-11-08 15:43:56
我正在尝试动态设置标题部分中的 x-goog-meta-reference,因此我想在函数签名中传递一个名为 reference 的参数,并将其分配给标题中的 x-goog-meta-reference。请参阅x-goog-meta-reference下面的代码示例。我关注了这个关于规范请求的链接。我的示例代码来自这里,但它是我的产品代码的编辑版本。func GenerateSignedURL(ctx context.Context, bucket string, key string, expiration time.Time,) (string, error) {    gcsClient, err := storage.NewClient(ctx)    if err != nil {        return "", fmt.Errorf("storage.NewClient: %v", err)    }    defer gcsClient.Close()    storage.SignedURL()    opts := &storage.SignedURLOptions{        Scheme:      storage.SigningSchemeV4,        Method:      "PUT",        ContentType: "text/csv",        Headers:     []string{            "x-goog-meta-reference: xxx", // << I want xxx value to be whatever I pass to this function as an arg        },        Expires:     expiration,    }    url, err := gcsClient.Bucket(bucket).SignedURL(key, opts)    if err != nil {        log.WithContext(ctx).Warn("Failed to generate a GCS signed URL")        return "", err    }    return url, nil}我尝试查看一些示例,但它们都是 s3 并且我没有遇到任何 gcp 示例代码。但是,我确实发现了这个问题,但我自己无法弄清楚。
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

正如@dazwilkin提到的那样,fmt.Sprintf对于这种情况来说已经足够了,但是您也可以使用我从mozilla移植的这个

import (

    "context"

    "fmt"

    "time"


    "cloud.google.com/go/storage"

    "github.com/dkbyo/go-stringhttpheader"

)


type Headers struct {

    GoogleMetaReference string `header:"x-goog-meta-reference"`

}


func GenerateSignedURL(bucket string, key string, expiration time.Time,

) (string, error) {

    ctx := context.Background()

    gcsClient, err := storage.NewClient(ctx)

    if err != nil {

        return "", fmt.Errorf("storage.NewClient: %v", err)

    }

    defer gcsClient.Close()

    headers := Headers{

        GoogleMetaReference: "xxx",

    }

    fmt.Print(stringhttpheader.Encode(headers))

    stringheaders, _ := stringhttpheader.Encode(headers)

    //storage.SignedURL()

    opts := &storage.SignedURLOptions{

        Scheme:      storage.SigningSchemeV4,

        Method:      "PUT",

        ContentType: "text/csv",

        Headers:     stringheaders,

        Expires:     expiration,

    }


    url, err := gcsClient.Bucket(bucket).SignedURL(key, opts)

    if err != nil {

        log.WithContext(ctx).Warn("Failed to generate a GCS signed URL")

        return "", err

    }


    return url, nil

}


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信