Golang谷歌存储可恢复上传HTTP 401

Posted

技术标签:

【中文标题】Golang谷歌存储可恢复上传HTTP 401【英文标题】:Golang google storage resumable upload HTTP 401 【发布时间】:2015-03-30 17:27:02 【问题描述】:

嘿,我正在尝试实现可恢复的上传到云存储。

但我得到一个 Status:"401 Unauthorized", StatusCode:401

我假设它与承载者有关,但我想不出另一种发送承载令牌的方法。

我已经能够使用 GetClinet 方法删除文件。

func GetClinet(c endpoints.Context) *http.Client 
    cli := &http.Client
        Transport: &oauth2.Transport
            Source: google.AppEngineTokenSource(c, storage.ScopeReadWrite),
            Base:   &urlfetch.TransportContext: c,
        ,
    

    return cli



client := GetClinet(con)

url := "https://storage.googleapis.com/bucketName/file.txt"
b := r.Header.Get("Authorization") //parse the bearer from user request
r, err = http.NewRequest("POST", url, nil)
r.Header.Add("Content-Type", "text/plain")
r.Header.Add("Content-Length", "0")
r.Header.Add("x-goog-resumable", "start")
r.Header.Add("Authorization", b)

resp, err := client.Do(r)

【问题讨论】:

我不确定“从用户请求中解析承载”是否意味着您正在运行网络服务器并且您想要访问用户的 Google Cloud Storage 帐户。如果是这样,您可能想熟悉一下:developers.google.com/accounts/docs/OAuth2WebServer @rein 仅针对该令牌的学习曲线就很高,在这种情况下文档还不够好,另一方面,代码更有用github.com/johnbalvin/google-cloud-go/blob/master/storage/… 【参考方案1】:

我也遇到了类似的问题,不知道你的情况是不是跟我一样。我的目标是

    用户客户端将元数据上传到我的服务器 服务器进行身份验证并存储在数据库中 服务器向 Google Cloud Storage 请求 resumabale upload url 服务器返回url给客户端 客户端使用 url 将媒体上传到 GCS

我也收到了 401 未经授权的退货。也许我没有正确设置标题?或者storage.SignedURL 不能正确处理可恢复的上传...?

我已经能够使用服务帐户 PEM 文件上传文件

func setGcsFile(c context.Context, fileId string, content []byte) error 
    expiration := time.Now().Add(time.Second * 30) //expire in 30 seconds

    data, err = ioutil.ReadFile(serviceAccountPEMFilename)
    if err != nil 
        fmt.Printf("error: %v", err)
        panic(err)
    

    log.Debugf(c, "Getting upload url")
    opts := &storage.SignedURLOptions
        GoogleAccessID: googleAccessID,
        PrivateKey:     data,
        Method:         "PUT",
        Expires:        expiration,
    

    putURL, err := storage.SignedURL(bucket, fileId, opts)
    if err != nil 
        log.Debugf(c, "%v", err)
        return err
    

    log.Debugf(c, "PUT URL : %v\n", putURL)

    client := urlfetch.Client(c)
    req, err := http.NewRequest("PUT", putURL, bytes.NewBuffer(content))
    res, err := client.Do(req)
    if err != nil 
        log.Debugf(c, "%v", err)
        return err
    
    res.Body.Close()
    log.Debugf(c, "Response Code: %s\n", res.Status)
    return nil

我正在考虑下一步拉取和修改storage.SignedURL 函数。

【讨论】:

以上是关于Golang谷歌存储可恢复上传HTTP 401的主要内容,如果未能解决你的问题,请参考以下文章

golang 在Go(golang)中进行分段上传的示例,客户端创建http请求而不是html表单。

golang 在mac 下go install成二进制文件,上传到centos 无法执行

Go语言实现FastDFS分布式存储系统WebAPI网关

可恢复上传的“临时文件”是不是计入每月存储费? (谷歌云存储)

golang 在Go(golang)中进行分段上传的示例

windows GoLang