【问题标题】:Golang google storage resumable upload HTTP 401Golang谷歌存储可恢复上传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.Transport{Context: 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-app-engine go google-cloud-storage


【解决方案1】:

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

  1. 用户客户端将元数据上传到我的服务器
  2. 服务器进行身份验证并存储在数据库中
  3. 服务器向 Google Cloud Storage 请求 resumabale upload url
  4. 服务器返回url给客户端
  5. 客户端使用 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 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 2014-01-02
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多