我正在尝试以多个 block 但已签名的 URL 将文件上传到谷歌存储。
以下是我正在执行的步骤:
- 使用 Node.js 创建可续传的上传 URL。
示例网址:https://www.googleapis.com/upload/storage/v1/b/MYBUCKET/o?name=sdk2.txt&uploadType=resumable&upload_id=AEnB2UrmFY9CKwkHFxsYdT71LcWa0zUVjG6iYfr9mHiwsIaG3c1goFiVURUPz6KFTIhtywndse00XaOkH7ftXPf82S7bNVRhPg
- 启动可恢复的上传 session :
POST https://www.googleapis.com/upload/storage/v1/b/MYBUCKET/o?name=sdk2.txt&uploadType=resumable&upload_id=AEnB2UrmFY9CKwkHFxsYdT71LcWa
使用这些 header :
Content-Type:text/plain
name:sdk2.txt
Content-Length:0
x-goog-resumable:start
HTTPS 响应:200 OK
- 发送第一个 block :
PUT https://www.googleapis.com/upload/storage/v1/b/MYBUCKET/o?name=sdk2.txt&uploadType=resumable&upload_id=AEnB2UrmFY9CKwkHFxsYdT71LcWa0zUVjG6iYfr9mHiwsIaG3c1goFiVURUPz6KFTIhtywndse00XaOkH7ftXPf82S7bNVRhPg
使用这些 header :
Content-Type:text/plain
name:sdk2.txt
Content-Length: 262144
Content-Range: bytes 0-262143/331886
HTTPS 响应:200 OK
有数据:
{
"kind": "storage#object",
"id": "MYBUCKET/sdk2.txt/1490608714382301",
"selfLink": "https://www.googleapis.com/storage/v1/b/testupload-sdk/o/sdk2.txt",
"name": "sdk2.txt",
"bucket": "MYBUCKET",
"generation": "1490608714382301",
"metageneration": "1",
"timeCreated": "2017-03-27T09:58:34.164Z",
"updated": "2017-03-27T09:58:34.164Z",
"storageClass": "MULTI_REGIONAL",
"timeStorageClassUpdated": "2017-03-27T09:58:34.164Z",
"size": "0",
"md5Hash": "1B2M2Y8AsgTpgAmY7PhCfg==",
"mediaLink": "https://www.googleapis.com/download/storage/v1/b/MYBUCKET/o/sdk2.txt?generation=1490608714382301&alt=media",
"crc32c": "AAAAAA==",
"etag": "CN33rZe29tICEAE="
}
根据documentation以上响应应为 308
而不是 200 OK
.
我在调用这些 API 时做错了什么?
最佳答案
第 2 步不是必需的。如果将步骤 2 替换为步骤 3,则响应将按预期返回 308
而不是 200
。
x-goog-resumable
仅适用于XML API
,因此在使用JSON API
时应省略。
在第 1 步中,断点续传被初始化。 GCS是在初始化上传的时候生成上传ID的,所以不可能在初始化上传之前就有上传ID。
第 2 步使用 0 字节对象完成可恢复上传,因为 GCS 将其解释为要上传的数据(由于第 1 步初始化上传)。结果,第 3 步返回了第 2 步的响应。如果断点续传完成,GCS 将返回创建对象的请求的响应。
关于google-cloud-storage - 如何将文件分块上传到谷歌存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43043982/