我一直在尝试学习如何使用Google Drive API通过可恢复的会话来更新Google Drive中的文件。
我收到了对上载内容请求的“禁止”回复。
您能帮助我找到丢失或滥用的步骤吗?
[用户被授予权限:
执行创建可恢复会话的请求:
检索会话网址:
通过使用可恢复会话发送内容:
我在文档中没有发现与此步骤相关的任何特定内容,因此我使用常规的上传文档https://developers.google.com/drive/api/v3/manage-uploads#upload-resumable更新“多个块”中的文件
我得到403错误状态代码,带有“禁止”原因,标头带有upload_id:
X-GUploader-UploadID:AEnB2Uqewr ...
如果我的理解正确,那么这个答案如何?请认为这只是几个可能的答案之一。
[很遗憾,从您的问题中,我无法理解您的测试的详细要求正文。因此,我无法复制您的情况。因此,在这个答案中,我想提出一个示例流程,以使用可恢复的上传更新现有文件。
在此答案中,作为一种示例情况,它假定Google云端硬盘中的文本文件通过具有多个块的断点续传进行更新。作为请求方法,我使用curl命令。
我为2个块准备了2个文件。作为测试情况,上载了262,144字节和37,856字节的2个块。因此,总上传大小为300,000字节。
使用断点续传时,请注意以下几点。
将块的数据添加到请求正文中。除了完成上传的最后一个块以外,创建大小为256 KB(256 x 1024字节)倍数的块。保持块大小尽可能大,以便上载高效。 Ref
[使用可恢复的上传创建要上传的会话。在这种情况下,现有文件将更新,因此端点为PUT https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable
。但重要的是,请使用PATCH
的方法代替PUT
。使用PUT
时,location
不包含在响应头中。我认为官方文件可能不正确。
$ curl -X PATCH -i \
-H "Authorization: Bearer ###accessToken###" \
"https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable"
如果要以分段上传的形式更新文件,请使用以下示例命令。在这种情况下,文件名将被更改。
$ curl -X PATCH -i \
-H "Authorization: Bearer ###accessToken###" \
-H "Content-Type: application/json; charset=UTF-8" \
-d '{"name":"updatedFilename.txt"}' \
"https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable"
200 OK
,并且响应标头包括location
,类似于location: https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable&upload_id=###
。为了上载数据,将location
用作端点。curl -X PUT -i \
-H "Content-Length: 262144" \
-H "Content-Range: bytes 0-262143/300000" \
-H "Content-Type: text/plain" \
-F "[email protected]" \
"https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable&upload_id=###"
308 Resume Incomplete
。这样,发现可以正确上载该块。curl -X PUT -i \
-H "Content-Length: 37856" \
-H "Content-Range: bytes 262144-299999/300000" \
-H "Content-Type: text/plain" \
-F "[email protected]" \
"https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable&upload_id=###"
200 OK
,并且还返回文件元数据。这样,发现可以正确完成可恢复的上传。PUT
修改为PATCH
以上传块,我也可以确认上述流程是否有效。-H "Content-Length: 300000" -H "Content-Range: bytes 0-299999/300000"
。如果我误解了你的问题,而这不是你想要的方向,我深表歉意。