【问题标题】:Permanent links to thumbnails in Google Drive APIGoogle Drive API 中缩略图的永久链接
【发布时间】:2014-09-03 15:35:58
【问题描述】:

我正在使用 Google Drive API (PHP) 将一些照片上传到我的云端硬盘。上传文件时,会在响应中返回一个Google_DriveFile 对象,以确认传输成功。它包括一个名为thumbnailLink 的字段,可通过getThumbnailLink getter 访问。它的内容可能如下所示:

https://lh4.googleusercontent.com/dqVdU195R4_0ZtWxsJlhW1Fr2K30xa2hH3V1KV4UrTBl9QkhOSR0ZqN9HoB-TjEQv8SIJw=s220

直到今天,我都确信链接不会随着时间的推移而自行改变。但是,当我尝试使用我保存在本地数据库中的缓存地址来显示我在云端硬盘上的照片的缩略图时,我收到了 403 错误 - 你可以在提到的链接下看到它。我向 API 询问了缩略图的当前链接,现在它完全不同了。

这种情况只发生在我身上一次,但针对多个文件,即我在云端硬盘上的所有文件突然有了新的缩略图链接。

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

【问题讨论】:

  • 每次文件内容更改时,缩略图都会失效。即使您发送自己的缩略图,您也必须不时获取新的驱动器,如果它可以创建一个,它会用自己的缩略图覆盖它。 developers.google.com/drive/web/file
  • 感谢您的反馈。嗯,这真的很奇怪。它使缓存缩略图的链接毫无意义。所以每次我想显示缩略图时,我都必须得到它的“新鲜”地址?要同时显示大量文件,可能需要很长时间。有没有办法至少以某种方式批量完成,即获取给定文件夹中所有文件的缩略图?
  • Web 客户端肯定可以一次获得一堆缩略图,但我还不想对其进行逆向工程。也许有一个记录在案的功能?

标签: google-drive-api


【解决方案1】:

试试这个:

https://drive.google.com/thumbnail?authuser=0&sz=w320&id=[fileid]

地点:

  • sz 是一个尺寸,您可以在其中使用w(宽度),h(高度)
  • fileid 是一个文件 ID。您可以在 Google Drive UI 的“分享”菜单中找到它。

【讨论】:

  • 非常感谢。我的问题是每个缩略图链接都是空的。我不知道为什么。但是在我的情况下,您的解决方案也可以正常工作。
  • @realtebo 你明白为什么每个缩略图链接都是空的吗?我也有同样的问题。
  • @realtebo 我刚刚发现了我的问题 - 身份验证范围没有更新为获取缩略图的正确权限。如果您希望获取缩略图,则不能只使用文件元数据的权限。
  • @EranMarom:有用的评论,谢谢。什么是正确的添加权限?
  • 如果您使用多个用户登录,则 authuser= 似乎是哪个用户的索引
【解决方案2】:

我已经阅读了他们提供的 API 文档:

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

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

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

可以发送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.

如果内容发生变化,则会生成新的缩略图,钩子会通知你地址,通过你的地址你可以获取新的信息。

【讨论】:

  • 感谢您的想法。我明天会尝试实现它,我们会看看它是否在这种奇怪的情况下也报告任何变化。
  • 我已尽力正确配置观看,但没有收到任何通知。在设置手表后,我确实收到了 API 的响应,确认我的请求正常。 webhook 地址似乎也很好——我正在使用一个名为 Poster 的 Firefox 插件来发送“人工”调用,我的网站会捕获它们并毫无问题地记录它们。你知道我犯了什么错误吗?
  • 在应用 webhook 后尝试更改内容,请查看钩子是否有效,如文档中明确提到的,仅在内容更改的情况下
  • 不幸的是,仍然没有通知。我在一个 TXT 文件上对其进行了测试,并确保我编辑了实际文件,而不是创建它的副本。
  • 我想我会自己实现缩略图。它不会像谷歌那样灵活,但有总比没有好。感谢您的帮助。
【解决方案3】:

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

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

在这种情况下,Angular 组件中的每个缩略图。如果您使用其他东西,您可以创建链接数组并遍历它以创建正确的拇指链接。

代码如下:

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();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2017-05-12
    • 2017-08-15
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多