Google drive api Google Drive API中缩略图的永久链接

Google drive api Google Drive API中缩略图的永久链接,google-drive-api,Google Drive Api,我正在使用谷歌驱动器API(PHP)上传一些照片到我的驱动器。上载文件时,响应中将返回一个Google\u DriveFile对象,以确认传输成功。它包括一个名为thumbnailLink的字段,可通过getThumbnailLinkgetter访问。其内容可能如下所示: 直到今天,我确信链接不会随着时间的推移自行改变。然而,当我试图使用本地数据库中的缓存地址显示我驱动器上的照片缩略图时,我遇到了403错误-您可以在上面提到的链接下看到它。我向API询问缩略图的当前链接,现在完全不同了 这只发

我正在使用谷歌驱动器API(PHP)上传一些照片到我的驱动器。上载文件时,响应中将返回一个
Google\u DriveFile
对象,以确认传输成功。它包括一个名为
thumbnailLink
的字段,可通过
getThumbnailLink
getter访问。其内容可能如下所示:

直到今天,我确信链接不会随着时间的推移自行改变。然而,当我试图使用本地数据库中的缓存地址显示我驱动器上的照片缩略图时,我遇到了403错误-您可以在上面提到的链接下看到它。我向API询问缩略图的当前链接,现在完全不同了

这只发生在我身上一次,但对于多个文件,即我的驱动器上的所有文件突然有了新的缩略图链接


有没有办法通过某个常量值快速检索文档(最好是照片)的缩略图,或者确保它不会更改?完美的解决方案是访问包含文档id的链接下的缩略图,而不是可能更改的哈希值。

我已经阅读了API文档,因为它们提供了:


重要信息:每次文件内容更改时,缩略图都会失效。提供缩略图时,每次修改内容时都要上传新的缩略图,这一点很重要

根据这些信息,这意味着只有在修改文件内容时才会生成新的缩略图。但在你的情况下,这真的很奇怪,内容没有改变,但缩略图改变了。从文档中看,没有批处理可用,但有另一种方法可用,即

根据文档,有可用的web钩子,即
文件:监视
过程,通过该过程可以跟踪对文件所做的更改。因此,这意味着每次更改内容时,钩子都会运行,您可以更改图像缩略图的缓存

可以发送HTTP请求以请求监视文件的更改

POST https://www.googleapis.com/drive/v2/files/fileId/watch
此处
fileID
表示加载文件后提供的ID

在请求正文中,提供具有以下结构的数据:

id     ==>  string  (A UUID or similar unique string that identifies 
            this channel.)

token# ==>  string  (An arbitrary string delivered to the target address with 
                    each notification delivered over this channel).

expiration# => long (Date and time of notification channel expiration, 
                     expressed as a Unix timestamp, in milliseconds.)

 type  ==> string  (The type of delivery mechanism used for this channel. 
                   The only option is web_hook.)

 address => string  (The address where notifications are delivered 
                     for this channel.)

 # Optional.
如果内容发生更改,将生成新的缩略图,钩子将通知您的地址,您可以通过您的地址获取新信息。

尝试以下操作:

其中:

  • sz
    是一种尺寸,您可以使用as
    w
    (宽度),as
    h
    (高度)
  • fileid
    是一个文件id。您可以在谷歌硬盘用户界面的“共享”菜单中找到它

    • 这里是另一个解决方案。假设我们只存储图像或PDF的GDrive ID(谷歌为许多文件类型生成拇指)

      我们可以向gDrive发送请求以获取有效的缩略图,因为即使文件没有更改,缩略图也会过期

      在这种情况下,每个缩略图都位于角度组件内。如果您使用其他东西,您可以创建链接数组,并对其进行迭代以创建正确的拇指链接

      代码如下:

      const thumb = () => {
                  if (this.item.DriveId) {
                  this.getThumb(this.item.DriveId, this.authToken)
                      .then(response => {
                          console.log(`response from service ${response}`);
                          // Set thumbnail width size to 300px or any other width if needed
                          this.item.externalThumbnailId = response.slice(0, -3) + 300;
                      })
                      //here we can handle cases when API limit exceeded 10 req in a sec
                      .catch(e => {
                          if(e.data.error.message == 'User Rate Limit Exceeded'){
                              console.log('Failed to load thumb. trying one more time');
                              setTimeout(thumb, 1000);
                          } else {
                              console.log(e);                        
                          }                       
                      });
                  }
                  };
      
      //call this function on component load. 
      thumb();
      

      另一个解决方案是编写一些后端脚本来更新数据库记录中的缩略图。

      每当文件内容更改时,缩略图都会失效。你将不得不不时地抓取新的,即使你发送自己的缩略图驱动器,如果它能创建一个,它也会用自己的缩略图覆盖它。谢谢你的反馈。嗯,那真的很奇怪。这使得缓存指向缩略图的链接变得毫无意义。所以每次我想显示缩略图,我必须得到它的“新”地址?要同时显示大量文件,可能需要很多时间。是否有一种方法至少可以批量完成,即获取给定文件夹中所有文件的缩略图?web客户端当然可以一次获取一堆缩略图,但我还不想对其进行反向工程。也许有一个记录在案的功能吗?谢谢你的想法。明天我将尝试实现它,我们将查看它是否也报告了此奇怪案例中的任何更改。我已尽了最大努力正确配置监视,但没有收到任何通知。我确实在设置手表后立即收到API的响应,确认我的请求是正确的。webhook地址似乎也不错——我正在使用一个名为Poster的Firefox插件发送“人工”呼叫,我的网站捕捉到这些呼叫并记录下来,没有问题。你知道我犯了什么错误吗?在应用webhook后,尝试更改内容,看看钩子是否能正常工作,就像文档中明确提到的那样,只是在内容发生更改的情况下。不幸的是,仍然没有通知。我在一个TXT文件上测试了它,确保我编辑了实际的文件,而不是创建了它的副本。我想我将自己实现缩略图。它不会像谷歌那样灵活,但有东西总比没有好。谢谢你的帮助,非常感谢。我的问题是每个缩略图链接都是空的。我不知道为什么。但你的解决方案在我的情况下也很好。@realtebo你明白为什么每个缩略图链接都是空的吗?我也遇到了同样的问题。@realtebo我刚刚发现了我的问题所在-身份验证范围没有更新为获取缩略图的正确权限。如果希望获取缩略图,则不能仅使用文件元数据的权限。@EranMarom:usefull comment,谢谢。添加的正确权限是什么?如果您与多个用户一起登录,authuser=似乎是哪个用户的索引