【发布时间】:2015-08-15 18:21:06
【问题描述】:
我在使用 Google Cloud 存储的可恢复上传音乐和视频文件时遇到了麻烦。即某些属性在上传时会丢失,然后从存储桶中下载回来。
详情:(左边是原始文件,右边是下载文件)
这不一定是音频的问题,但它是视频的问题,因为浏览器现在不会在浏览器中播放它。
上传过程和这个question差不多
执行初始可恢复上传的小代码示例:
func StoreUpload(c appengine.Context, cn context.Context, contentType string, filename string, email string, origin string) (string, string, error) {
uuid, err := UUID()
if err != nil{
return "", "", err
}
filename = uuid + filename[len(filename)-4:]
tokenSource := google.AppEngineTokenSource(cn, storage.ScopeFullControl)
token, err := tokenSource.Token()
if err != nil{
return "", "", err
}
metaBody := []byte("{ \"metadata\": { \"x-goog-meta-uploader\": \""+ email +"\" }}")
req, err := http.NewRequest(
"POST",
fmt.Sprintf("https://www.googleapis.com/upload/storage/v1/b/%s/o?uploadType=resumable&name=upload/%s", models.HYLIGHT_EXTERNAL_BUCKET, filename),
bytes.NewReader(metaBody),
)
req.Header.Set("Authorization", "Bearer " + token.AccessToken)
req.Header.Set("X-Upload-Content-Type", contentType)
req.Header.Set("Content-Type", "application/json; charset=UTF-8")
req.Header.Set("Content-Length", fmt.Sprint(len(metaBody)))
req.Header.Set("Origin", origin)
client := &http.Client{
Transport: &urlfetch.Transport{
Context: c,
Deadline: 20 * time.Second,
},
}
res, err := client.Do(req)
if err != nil{
return "", "", err
}
return res.Header.Get("Location"), filename, err
}
google 云存储桶中的结果将具有正确的 mimetype 视频/mp4(由浏览器决定),但仍无法在浏览器上查看。
编辑:
我也尝试在收到可恢复的上传链接后使用 chrome 扩展“邮递员”上传文件,但在上传到 GCS 时它的属性也丢失了,所以它似乎与所涉及的 JS 端无关将文件上传到 GCS。
如果我使用 console.developer.google 上的“上传文件夹”按钮直接上传包含视频文件的文件夹,则会保留该文件的属性。
【问题讨论】:
-
嗨,Rohan,查看您的代码并阅读行为,看起来这实际上可能是平台的问题。你介意在我们的问题跟踪器上发布这个吗? code.google.com/p/googleappengine/issues/list。如果您可以包含这个和一个压缩的最小项目来重现您的上传,那将非常有帮助(基本上是您在此处拥有的代码,带有正确的配置文件,在一个 zip 中)。谢谢:)