Google Cloud Platform:无法通过API在Storage中上传新文件版本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google Cloud Platform:无法通过API在Storage中上传新文件版本相关的知识,希望对你有一定的参考价值。
我编写了一个脚本,将文件上传到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以及新一代号码(启用版本控制)。但是,文件内容没有更新:我确实添加了新的字符串,但它们没有在文件中显示。你有什么主意吗?
非常感谢提前。
根据可用信息,很难确定地诊断此问题 - 但是我会检查分配给您用于此操作的用户或服务帐户的角色。
由于您已经能够上传文件,但没有覆盖文件,这听起来像您可能已将尝试执行此任务的用户或服务帐户分配为“存储对象创建者”角色。
具有Storage Object Creator角色的用户/服务帐户可以在存储桶中创建新对象,但不能覆盖现有对象(您可以看到这提到here)。
如果是这种情况,您可以尝试为用户/服务帐户分配“存储对象管理”角色,该角色允许用户完全控制存储桶对象。
“insert”仅用于根据API文档的Methods部分创建新对象,因此您需要使用“rewrite”来重写现有对象。
以上是关于Google Cloud Platform:无法通过API在Storage中上传新文件版本的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Messaging VS Google Cloud Platform
google-cloud-platform:外部 DNS 配置不起作用
使用新的 Google Cloud 日志记录 jar 时,日志未显示在 Google Cloud Platform Stackdriver 中
Google Cloud Platform:Cloud Functions 与 App Engine