Google Cloud Platform:无法通过API在Storage中上传新文件版本

问题描述 投票:1回答:2

我编写了一个脚本,将文件上传到Google云端存储中的存储桶:

参考:https://cloud.google.com/storage/docs/json_api/v1/objects/insert

function submitForm(bucket, accessToken) {

    console.log("Fetching the file...");
    var input = document.getElementsByTagName('input')[0];
    var name = input.files[0].name;
    var uploadUrl = 'https://www.googleapis.com/upload/storage/v1/b/'+
     bucket + '/o?uploadType=media&access_token=' + accessToken + '&name=' + name;
    event.preventDefault();
    fetch(uploadUrl, {
            method: 'POST',
            body: input.files[0]
        }).then(function(res) {
            console.log(res);
            location.reload();
        })
        .catch(function(err) {
            console.error('Got error:', err);
        });

}

上传新文件时,它可以正常工作。但是,在尝试使用新版本替换现有文件时,我在API响应正文中获得了403状态代码。

请注意:

  • Google云端存储的OAuth 2.0范围是:https://www.googleapis.com/auth/devstorage.read_write
  • 我确实为目标存储桶启用了版本控制

有人能帮助我指出我做错了什么吗?

更新I:

按照建议,我试图调用重写函数如下:

    const input = document.getElementsByName('uploadFile')[0];
    const name = input.files[0].name;


 const overwriteObjectUrl = 'https://www.googleapis.com/storage/v1/' + 
     'b/' + bucket +
     '/o/' + name +
     '/rewriteTo/b/' + bucket +
     '/o/' + name;

    fetch(overwriteObjectUrl, {
        method: 'POST',
        body: input.files[0]
    })

但是,我得到400(错误的请求错误)。

{"error":{"errors":[{"domain":"global","reason":"parseError","message":"Parse Error"}],"code":400,"message":"Parse Error"}}

你能解释一下我做错了什么吗?

更新II:

通过用body: input.files[0]改变body: input.files[0].data我让它工作......从理论上讲!

我得到一个积极的回应机构:

{  
   "kind":"storage#rewriteResponse",
   "totalBytesRewritten":"43",
   "objectSize":"43",
   "done":true,
   "resource":{  
      "kind":"storage#object",
      "id":"mybuck/README.txt/1520085847067373",
      "selfLink":"https://www.googleapis.com/storage/v1/b/mybuck/o/README.txt",
      "name":"README.txt",
      "bucket":"mybuck",
      "generation":"1520085847067373",
      "metageneration":"1",
      "contentType":"text/plain",
      "timeCreated":"2018-03-03T14:04:07.066Z",
      "updated":"2018-03-03T14:04:07.066Z",
      "storageClass":"MULTI_REGIONAL",
      "timeStorageClassUpdated":"2018-03-03T14:04:07.066Z",
      "size":"43",
      "md5Hash":"UCQnjcpiPBEzdl/iWO2e1w==",
      "mediaLink":"https://www.googleapis.com/download/storage/v1/b/mybuck/o/README.txt?generation=1520085847067373&alt=media",
      "crc32c":"y4PZOw==",
      "etag":"CO2VxYep0NkCEAE="
   }
}

Whit以及新一代号码(启用版本控制)。但是,文件内容没有更新:我确实添加了新的字符串,但它们没有在文件中显示。你有什么主意吗?

非常感谢提前。

google-api google-cloud-platform google-cloud-storage
2个回答
1
投票

根据可用信息,很难确定地诊断此问题 - 但是我会检查分配给您用于此操作的用户或服务帐户的角色。

由于您已经能够上传文件,但没有覆盖文件,这听起来像您可能已将尝试执行此任务的用户或服务帐户分配为“存储对象创建者”角色。

具有Storage Object Creator角色的用户/服务帐户可以在存储桶中创建新对象,但不能覆盖现有对象(您可以看到这提到here)。

如果是这种情况,您可以尝试为用户/服务帐户分配“存储对象管理”角色,该角色允许用户完全控制存储桶对象。


1
投票

“insert”仅用于根据API文档的Methods部分创建新对象,因此您需要使用“rewrite”来重写现有对象。

© www.soinside.com 2019 - 2024. All rights reserved.