Google Drive Rest API - 如何检查文件是否已更改

问题描述 投票:1回答:3

有没有一种可靠的方法,比较全部内容,检查文件是否在Drive中更新/更改?

我一直在努力解决这个问题。这是我尝试过的两件事:

1.档案version号码

我将纯文本文件上传到Google云端硬盘(qazxsw poi,qazxsw poi),并在成功上传后从simple upload中保存qazxsw poi。

然后我偶尔轮询Drive API(update endpoint)以检查版本是否已更改。

麻烦的是,在上传文件的一两秒内,版本再次出现问题。

文件内容没有变化。该文件尚未在其他任何地方打开,查看甚至下载。尽管如此,版本号仍然比上传后的版本号增加了。

对于我的代码,此版本号更改表示远程文件已在Drive中更改,因此它会下载新版本。每次!

2. version终点

作为替代方案,我尝试使用file metadata

上传文件后,我使用get endpointChanges获得Changes api

稍后我使用此page token轮询Changes API以进行更改,并过滤上传文件的fileId的更改。轮询更改时我使用这些选项:

changes.getStartPageToken

这里再次出现与版本号相同的问题。上传文件后立即返回的页面标记会在一两秒内再次更改。新页面标记显示已更改的上载文件。

同样,文件内容没有变化。它尚未在其他任何地方打开,更新和下载。它不与其他任何人共享。

然而,在上传几秒钟后,文件会重新出现在更改列表中。

因此,假设远程更改,本地代码会从Drive重新下载文件。


可能的解决方法

作为一个hacky hook,我可以在文件上传后等待几秒钟,然后再获取新的file-version / changes-page-token。这可能会解决延迟版本增量问题。

但是,没有关于导致版本号(或changes.list)中的幻像更改的原因的文档。所以,我无法确定:

  1. 等待多长时间才能获得“已结算”版本号而不会丢失其他用户/应用程序可能发生的更改?
  2. 新的(延迟的)版本号是稳定的,还是可以在任何时候无缘无故再次更改?

有没有一种可靠的方法,比较全部内容,检查文件是否在Drive中更新/更改?

google-drive-sdk
3个回答
4
投票

如果您的文件不是Google Doc文件(即二进制文件),您可以尝试使用changes.listpage token属性。您应该能够使用它来跟踪二进制文件内容的更改。

您也可以使用{ "includeRemoved": false "restrictToMyDrive": true "spaces": "drive" }

md5Checksum也有File resource object财产。


1
投票

您所看到的是Google Drive文件系统的最终一致性功能。如果您考虑搜索,搜索索引的更新速度并不重要,只是它最终会更新并且非常有效。 Google云端硬盘的工作原理相同。

Drive会尽快确认您的更新。早在这些更新传播到您的文件的所有全球副本之前很久。在更新完成后,还会计算派生数据(例如,时间戳,我想我记得,md5sums)。

解决方案在很大程度上取决于冗余同步对您的应用程序的问题。

  • 几秒钟的延迟足以应对绝大多数幻像更新。
  • 您可以切换到v2 API并使用etags。
  • 您可以使用自定义属性实现自己的版本号。因此,每次同步时,都会增加自己的版本号。只有在应用程序版本号发生更改时才会同步。

1
投票

作为解决方法,如何使用Drive Activity API?我认为你的情况有几个答案。所以请把它想象成其中之一。

使用Drive Activity API时,可以检索有关目标文件的活动信息。例如,从Revisions API,您可以查看目标文件是否已编辑,重命名,删除等。

样本端点和请求正文如下。

Endpoint:

Revisions resource object

Request body:

md5Checksum

Response:

样品响应如下。您可以从中看到相关信息。在时间戳记编辑了带有fileId和filename的文件。

ActionDetail

Note:

  • 在我的环境中使用此API时,请在API控制台上启用Drive Activity API,并在范围中包含POST https://driveactivity.googleapis.com/v2/activity:query?fields=activities%2CnextPageToken
  • 虽然当我使用这个API时,我觉得响应很快,如果你使用它时反应很慢,我道歉。

References:

  • {"itemName": "items/### fileId of target file ###"}
  • { "activities": [ { "primaryActionDetail": { "edit": {} <--- If the target file was edited, this property is added. }, "actors": [ { "user": { "knownUser": { "personName": "people/### userId who edited the target file ###", "isCurrentUser": true } } } ], "actions": [ { "detail": { "edit": {} } } ], "targets": [ { "driveItem": { "name": "items/### fileId of target file ###", "title": "### filename of target file ###", "file": {}, "mimeType": "### mimeType of target file ###", "owner": { "user": { "knownUser": { "personName": "people/### owner's userId ###", "isCurrentUser": true } } } } } ], "timestamp": "2000-01-01T00:00:0.000Z" }, ], "nextPageToken": "###" }

如果这不是你想要的,我道歉。

© www.soinside.com 2019 - 2024. All rights reserved.