我正在尝试使用 Postman 模拟可恢复上传到 GCS 签名 URL 来执行两个 PUT 以查看它是如何工作的。
参考了几篇帖子后:
我可以使用 Google Cloud Storage 签名 URL 进行可恢复上传吗?
如何使用带有签名网址的 gcs-resumable-upload
我终于成功了,成功找回了 200 OK,但是文件损坏了。以下是步骤:
0)。POST 到我们的服务器(运行 NodeJS 8.11)以获取带有 action=="resumable" 的存储桶签名 URL。服务器代码是:
const file = bucket.file(fileName);
const config = {
action: 'resumable',
version: 'v4',
expires,
contentType
};
file.getSignedUrl( config, (error, url) => {
if (error) return reject(error);
resolve(url);
});
这将返回签名的网址:
https://storage.googleapis.com/<bucket_name/<path_to_file>?GoogleAccessId=<service_account>&Expires=<expiry_time>&Signature=<signature>
1)。POST 到带有标题{ 'x-goog-resumable': 'start' }
和空正文的签名 url。我返回了创建的 HTTP 201,并且“位置”标头的值与签名 URL 相同,&upload_id=AEnB2UqIJL_jf.....
最后加上带有 upload_id 的“X-GUploader-UploadID”标头。
2)。要模拟单个文件大小为 730417 的 2 次上传,首先 PUT 到从 (1) 返回的“位置”,带有标题:
Content-Length: 262144
Content-Range: bytes 0-262143/730417
Content-Type: application/pdf
并在 Postman 中选择 body 作为“二进制”并选择源文件。我收到了 HTTP 308 (Resume Incomplete) 的响应,并且在响应头中:
Content-Type: text/plain; charset=utf-8
Range: bytes=0-262143
X-Range-MD5: ccafa0beacd8c342bb460b95249114dc
X-GUploader-UploadID: AEnB2UqIJL_jf.....
3)。要检查当前的上传状态,请按照步骤 (2) 执行 PUT 到相同的“位置”网址,正文和标题为空:
Content-Length: 0
Content-Range: bytes */730417
我得到了与 (2) 中相同的 HTTP 308 (Resume Incomplete),以及响应标头:
Content-Type: text/plain; charset=utf-8
X-GUploader-UploadID: (same_upload_id)
Range: bytes=0-262143
X-Range-MD5: ccafa0beacd8c342bb460b95249114dc
此刻,我仍然没有从 GCS 存储桶控制台看到存储桶中上传的文件。
4)。到目前为止一切顺利,所以我用 PUT 的第二部分完成了它,带有以下标题的相同“位置”url,并选择正文作为“二进制”并选择相同的源文件:
Content-Length: 468273
Content-Range: bytes 262144-730416/730417
Content-Type: application/pdf
我用响应头返回 HTTP 200 OK:
x-goog-generation: 1568787913806411
x-goog-stored-content-length: 730417
ETag: "018677cb75c5a307217eec21fa18ee91"
Content-Length: 0
Content-Type: text/html; charset=UTF-8
我可以看到上传的文件出现在 GCS 控制台中。
5)。现在的问题是:从GCS下载的文件与源文件的字节数相同,但MD5校验和与源文件不匹配。源文件是一个3页的PDF文件,上传的文件下载后只有最后一页。
会出什么问题?...我在邮递员步骤中做错了什么吗?...这些步骤似乎正确地遵循了这里的步骤https://cloud.google.com/storage/docs/xml-api/resumable-upload,但是损坏的内容对我来说很神秘,我不确定在哪里解决这个问题......也许使用另一个客户端来尝试恢复上传到签名网址?...任何建议都非常感谢,谢谢!