Google api 无法使用可恢复方法更新Google驱动器中的文件

Google api 无法使用可恢复方法更新Google驱动器中的文件,google-api,google-drive-api,Google Api,Google Drive Api,我一直在尝试学习如何使用GoogleDrive API通过可恢复会话更新GoogleDrive中的文件 我收到了对上传内容请求的“禁止”响应 你能帮我找到丢失或误用的步骤吗 用户已获得以下权限的授权: drive.file() 执行创建可恢复会话的请求: 补丁' 检索会话url: 使用可恢复会话发送内容: 放 我在文档中找不到任何与此步骤相关的特定内容,所以我使用常规上载文档以“多块”的形式更新文件 我得到了带有“禁止”原因的状态代码和带有上载id的标题 X-GUploader-Uploa

我一直在尝试学习如何使用GoogleDrive API通过可恢复会话更新GoogleDrive中的文件

我收到了对上传内容请求的“禁止”响应

你能帮我找到丢失或误用的步骤吗

  • 用户已获得以下权限的授权:

    • drive.file()
  • 执行创建可恢复会话的请求:

    补丁'

  • 检索会话url:

  • 使用可恢复会话发送内容:

    我在文档中找不到任何与此步骤相关的特定内容,所以我使用常规上载文档以“多块”的形式更新文件

  • 我得到了带有“禁止”原因的状态代码和带有上载id的标题

    X-GUploader-UploadID:AEnB2Uqewr

    • 您希望使用可恢复上载方法更新Google Drive中的现有文件
    不幸的是,从你的问题来看,我无法理解你测试的细节请求主体。这样,我无法复制你的情况。因此,在这个答案中,我想提出一个使用可恢复上传更新现有文件的示例流程

    样本情况: 在这个回答中,作为一个示例情况,它假设GoogleDrive中的一个文本文件是由具有多个块的可恢复上传更新的。作为请求的方法,我使用curl命令

    我准备了2个文件,共2块。作为测试情况,上传了262144字节和37856字节的2个CHUNC。所以总上传大小是300000字节

    使用可恢复上传时,请注意以下几点

    将区块的数据添加到请求正文中。创建大小为256 KB(256 x 1024字节)倍数的块,完成上载的最后一个块除外。保持区块大小尽可能大,以便上传高效

    使用可恢复上载更新文件的流程: 1.启动可恢复的上载会话 使用可恢复上载创建上载会话。在这种情况下,将更新现有文件,因此端点是
    PUThttps://www.googleapis.com/upload/drive/v3/files/[文件ID]?上传类型=可恢复
    。但重要的一点是,请使用
    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
      like
      location:https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=可恢复&upload_ID=####
      。对于上载数据,使用
      位置
      作为端点
    2.上传第一个区块
    • 运行此curl命令时,将返回
      308 Resume completed
      。通过这一点,可以发现该区块可以正确上传
    3.上载第二个区块(这是此示例流的最后一个区块。)
    • 运行此curl命令时,将返回
      200ok
      ,并返回文件元数据。通过这一点,可以发现可以正确完成可恢复上传
    注:
    • 在这种情况下,文件更新为覆盖。因此,请注意这一点。
    • 在我的环境中,即使将
      PUT
      修改为
      PATCH
      以上载区块,我也可以确认上述流程是否有效。
      • 如果在您的环境中发生错误,请尝试测试此修改
    • 关于上述示例情况,如果您想上传一个300000字节的块,请使用
      -H“内容长度:300000”-H“内容范围:字节0-299999/300000”
    参考资料:

    感谢您的详细回答,这帮助我了解我使用的是正确的流程,实际问题应该是发送内容的请求。我复制了它:“父字段不能在更新请求中直接写入。请改用addParents和removeParents选项。”因此,我只需要在更新操作期间从文件元数据中删除“父字段”。@Pavel感谢您的回复和测试。我很高兴你的问题解决了。也谢谢你。
    $ curl -X PUT -i \
      -H "Content-Length: 262144" \
      -H "Content-Range: bytes 0-262143/300000" \
      -H "Content-Type: text/plain" \
      -F "file=@data1.txt" \
      "https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable&upload_id=###"
    
    $ curl -X PUT -i \
      -H "Content-Length: 37856" \
      -H "Content-Range: bytes 262144-299999/300000" \
      -H "Content-Type: text/plain" \
      -F "file=@data2.txt" \
      "https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable&upload_id=###"