可恢复上传时丢失文件属性 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

感谢您与我一起查明此事!