可恢复上传时丢失文件属性 Google 云存储
Losing file properties on resumeable upload Google Cloud Storage
我 运行 在使用 Google 云存储的可恢复上传音乐和视频文件时遇到了麻烦。即某些属性在上传时丢失,然后从存储桶中下载回来。
详细信息:(左侧为原始文件,右侧为下载文件)
常规:(左侧为原始文件,右侧为下载文件)
这不一定是音频的问题,但它是视频的问题,因为浏览器现在不会在浏览器中播放它。
上传过程与此大致相同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 云存储桶中的结果将具有 video/mp4 的正确 mimetype(由浏览器决定),但仍然无法在浏览器上查看。
编辑:
我也试过使用 chrome 扩展 'Postman' 在收到可恢复的上传后上传文件 link 但是当上传到 GCS 时它的属性也会丢失,所以它似乎与将文件上传到 GCS 所涉及的 JS 端无关。
如果我使用 console.developer.google 上的 'upload folder' 按钮直接上传包含视频文件的文件夹,文件的属性将被保留。
事实证明,文件在通过浏览器的 HTML "input" 表单提交到 Google 云存储时已损坏。但是,如果通过JavaScript对文件post使用相同的URL,文件却没有损坏,这很奇怪。
我正在让 GCS 团队调查这个问题,看看是否有解决办法。
完整的详细信息以及解决方法位于此处:
https://code.google.com/p/googleappengine/issues/detail?id=12268
感谢您与我一起查明此事!
我 运行 在使用 Google 云存储的可恢复上传音乐和视频文件时遇到了麻烦。即某些属性在上传时丢失,然后从存储桶中下载回来。
详细信息:(左侧为原始文件,右侧为下载文件)
常规:(左侧为原始文件,右侧为下载文件)
这不一定是音频的问题,但它是视频的问题,因为浏览器现在不会在浏览器中播放它。
上传过程与此大致相同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 云存储桶中的结果将具有 video/mp4 的正确 mimetype(由浏览器决定),但仍然无法在浏览器上查看。
编辑:
我也试过使用 chrome 扩展 'Postman' 在收到可恢复的上传后上传文件 link 但是当上传到 GCS 时它的属性也会丢失,所以它似乎与将文件上传到 GCS 所涉及的 JS 端无关。
如果我使用 console.developer.google 上的 'upload folder' 按钮直接上传包含视频文件的文件夹,文件的属性将被保留。
事实证明,文件在通过浏览器的 HTML "input" 表单提交到 Google 云存储时已损坏。但是,如果通过JavaScript对文件post使用相同的URL,文件却没有损坏,这很奇怪。
我正在让 GCS 团队调查这个问题,看看是否有解决办法。
完整的详细信息以及解决方法位于此处: https://code.google.com/p/googleappengine/issues/detail?id=12268
感谢您与我一起查明此事!