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

时间:2015-03-30 17:27:03

标签: google-app-engine go google-cloud-storage

嘿,我试图实现可恢复的上传到云端存储。

但我获得状态:" 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)

1 个答案:

答案 0 :(得分:0)

我遇到了类似的困难,不确定你的情况是否与我的相同。我的目标是

  1. 用户客户端将元数据上传到我的服务器
  2. 服务器在数据库中进行身份验证和存储
  3. 服务器要求Google Cloud Storage resumabale upload url
  4. 服务器将url返回给客户端
  5. 客户使用网址将媒体上传到GCS
  6. 我也有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功能。