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 无法执行