Google drive api 谷歌驱动器RESTAPI-如何检查文件是否已更改

Google drive api 谷歌驱动器RESTAPI-如何检查文件是否已更改,google-drive-api,Google Drive Api,除了比较完整内容外,是否有可靠的方法检查驱动器中的文件是否更新/更改? 我已经为此挣扎了一段时间。以下是我尝试过的两件事: 1。文件版本编号 我将一个纯文本文件上传到Google Drive(,),并保存成功上传后返回的版本 然后,我偶尔轮询驱动器API(),以检查版本是否已更改 问题是在上传文件的一两秒钟内,版本会再次升级 文件内容没有更改。该文件尚未在其他任何地方打开、查看或下载。尽管如此,版本号还是比上传后增加了 对我的代码来说,此版本号更改表示驱动器中的远程文件已更改,因此它将下载新版本

除了比较完整内容外,是否有可靠的方法检查驱动器中的文件是否更新/更改?

我已经为此挣扎了一段时间。以下是我尝试过的两件事:

1。文件
版本
编号

我将一个纯文本文件上传到Google Drive(,),并保存成功上传后返回的
版本

然后,我偶尔轮询驱动器API(),以检查版本是否已更改

问题是在上传文件的一两秒钟内,版本会再次升级

文件内容没有更改。该文件尚未在其他任何地方打开、查看或下载。尽管如此,版本号还是比上传后增加了

对我的代码来说,此版本号更改表示驱动器中的远程文件已更改,因此它将下载新版本。每一次

2。
更改
端点

作为替代,我试着使用

上传文件后,我使用或获得一个
页面标记

稍后,我使用这个
页面标记
轮询Changes API以获取更改,并过滤更改以获取上传文件的fileId。我在轮询更改时使用以下选项:

{
    "includeRemoved": false
    "restrictToMyDrive": true
    "spaces": "drive"
}
这里同样存在与版本号相同的问题。在一两秒钟内再次上传文件更改后,页面标记立即返回。新页面标记显示上载的文件已更改

同样,文件的内容没有更改。它还没有在其他任何地方被打开、更新和下载。它不与任何其他人共享

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

因此,本地代码将从驱动器中重新下载文件,并假定进行了远程更改


可能的解决方法

作为一个黑客,我可以在文件上传后等待几秒钟,然后再获取新的文件版本/更改页面标记。这可能会解决延迟版本增量问题

但是,没有文档说明是什么导致了版本号(或changes.list)中的幻影更改。因此,我无法确切地知道:

  • 在不丢失其他用户/应用可能进行的更改的情况下,获得“已确定”版本号的安全等待时间有多长
  • 新的(延迟的)版本号是否稳定,或者可能会在任何时候无故再次更改


  • 除了比较完整内容外,是否有可靠的方法检查文件是否在驱动器中更新/更改?

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

    您也可以使用


    还有一个
    md5Checksum
    属性。

    您看到的是Google Drive文件系统的最终一致性功能。如果你考虑搜索,搜索索引的更新速度并不重要,只是它最终会被更新,而且阅读效率很高。谷歌硬盘的工作原理是一样的

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

    解决方案在很大程度上取决于冗余同步对应用程序的影响程度

    • 几秒钟的延迟足以处理绝大多数幻影更新
    • 您可以切换到v2api并使用etag
    • 您可以使用自定义属性实现自己的版本号。因此,每次同步时,您都会增加自己的版本号。仅当应用程序版本号已更改时,才可以停止同步

    作为一种解决方法,如何使用驱动器活动API?我认为对你的情况有几个答案。所以,请把这看作是其中之一

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

    示例端点和请求主体如下所示

    终点: 请求机构: 答复: 答复样本如下。你可以从这里看到信息。具有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": "###"
    }
    
    {
    “活动”:[
    {
    “primaryActionDetail”:{
    
    “编辑”:{}谢谢!已经试过了,但忘了在上面的帖子中提到。我想修订API只适用于Google文档、工作表和幻灯片。当我尝试修改文件时,修订API返回404-它是纯文本文件。@AdiB您是否尝试过或中的
    md5Checksum
    属性。谢谢!我错过了
    md5Checksu
    文件
    资源中的m
    属性。将对此进行测试。如果内容没有更改,希望它会保持稳定。感谢@dimu designs。文件
    版本
    md5Checksum
    的组合在检测远程文件更改方面效果良好。谢谢!冗余同步非常有问题,因此需要帮助。Also,因为它是一种开放文件格式,所以我无法向它添加自定义版本属性。在获取版本之前添加2秒延迟可以作为一种解决方案,但我就是不习惯。没有记录/建议的延迟,所以不能保证它不会中断。使用
    版本
    md5Checksum
    -上面的建议-解决了问题,并且我能够删除延迟。酷。正如我所说的,我似乎记得md5sum属性是异步设置的,因此有时2s还不够,例如Google数据中心
    {"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": "###"
    }