Google Drive API中指向缩略图的永久链接

时间:2014-09-03 15:35:58

标签: google-drive-api

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

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

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

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

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

3 个答案:

答案 0 :(得分:48)

试试这个: https://drive.google.com/thumbnail?authuser=0&sz=w320&id=[fileid] 哪里: - “sz”是一个大小,你可以使用“w”(宽度),作为“h”(高度) - [fileid]是文件ID。您可以通过右键单击谷歌驱动器ui

在“共享”菜单中找到它

答案 1 :(得分:4)

我已经完成了他们提供的API文档:

  

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

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

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

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

如果内容被更改,则会生成新的缩略图,并且hook会通知您地址,您可以通过地址获取新信息。

答案 2 :(得分:1)

这是另一种解决方案。假设我们只存储图像或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();

另一种解决方案是编写一些后端脚本来更新DB记录中的拇指。