我正在使用Google Drive API(PHP)将一些照片上传到我的云端硬盘。上载文件时,会在响应中返回Google_DriveFile
对象以确认传输成功。它包含一个名为thumbnailLink
的字段,可通过getThumbnailLink
getter访问。其内容可能如下所示:
直到今天,我确信链接不会随着时间的推移而自行改变。但是,当我尝试在我的驱动器上显示照片的缩略图时,使用我保存在本地数据库中的缓存地址,我收到403错误 - 您可以在上述链接下看到它。我向API询问了缩略图的当前链接,现在它完全不同了。
它只发生在我身上,但对于多个文件,即我在驱动器上的所有文件突然得到了新的缩略图链接。
有没有办法快速检索某个文档的缩略图(最好是一张照片),或者确保它不会改变?完美的解决方案是在包含文档id
的链接下访问缩略图,而不是可能更改的某些哈希值。
答案 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记录中的拇指。