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

时间:2019-02-20 15:42:53

标签: google-drive-api

是否存在一种可靠的方法,除了比较完整内容外,还可以检查文件是否在云端硬盘中已更新/更改?

我一直为此苦苦挣扎。这是我尝试过的两件事:

1。归档version

我将纯文本文件上传到Google云端硬盘(simple uploadupdate endpoint),并在成功上传后返回的file metadata中保存version

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

问题在于,在上传文件后的一两秒钟内,该版本再次遭到破坏。

文件内容没有更改。该文件尚未打开,查看或什至没有下载到其他任何地方。尽管如此,版本号仍比上传后的版本高。

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

2。 Changes个端点

我尝试使用Changes api

上传文件后,我使用changes.getStartPageTokenchanges.list得到了page token

稍后,我使用此page token来轮询Changes API的更改,并过滤上载文件的fileId的更改。轮询更改时,我使用以下选项:

{
    "includeRemoved": false
    "restrictToMyDrive": true
    "spaces": "drive"
}

再一次,存在与版本号相同的问题。上传文件后立即返回的页面令牌在一两秒钟内再次更改。新页面令牌显示上传的文件已更改。

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

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

结果是,本地代码假设进行了远程更改,从云端硬盘重新下载了文件。


可能的解决方法

作为一个棘手的挂钩,我可以在文件上传后等待几秒钟,然后再获取新的文件版本/更改页面令牌。这可以解决延迟的版本增加问题。

但是,没有文档说明引起此幻像版本号更改的原因(或changes.list)。因此,我不确定是否知道:

  1. 等待多长时间才能安全地获得“已解决”的版本号,而不会丢失其他用户/应用程序可能进行的更改?
  2. 新的(延迟的)版本号是否稳定,或者可能随时无故再次更改?

是否存在一种可靠的方法,除了比较完整内容外,还可以检查文件是否在云端硬盘中已更新/更改?

3 个答案:

答案 0 :(得分:1)

如果您的文件不是Google Doc文件(即二进制文件),则可以尝试使用File resource objectmd5Checksum属性。您应该可以使用它来跟踪二进制文件内容的更改。

您也许还可以使用Revisions API

Revisions resource object还具有md5Checksum属性。

答案 1 :(得分:1)

您看到的是Google云端硬盘文件系统的最终一致性功能。如果您考虑搜索,则搜索索引的更新速度没有多大关系,只是最终会更新索引并非常有效地进行读取。 Google云端硬盘在相同的前提下工作。

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

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

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

答案 2 :(得分:1)

作为解决方法,如何使用Drive Activity API?我认为您的情况有几个答案。因此,请仅考虑其中之一。

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

示例端点和请求正文如下。

端点:

POST https://driveactivity.googleapis.com/v2/activity:query?fields=activities%2CnextPageToken

请求正文:

{"itemName": "items/### fileId of target file ###"}

响应:

样品响应如下。您可以从中查看信息。带有fileId和filename的文件是在时间戳上编辑的。

{
  "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": "###"
}

注意:

  • 在我的环境中使用此API时,请在API控制台上启用Drive Activity API,并将https://www.googleapis.com/auth/drive.activity.readonly包括在范围中。
  • 尽管我使用此API时,我感觉响应速度很快,但是如果使用时响应缓慢,我深表歉意。

参考文献:

如果这不是您想要的,我表示歉意。