【发布时间】:2019-01-13 07:08:49
【问题描述】:
我正在尝试访问由我的 web 应用使用 node.js 的官方 google api 库 (https://github.com/googleapis/google-api-nodejs-client/) 创建的文件夹中的媒体文件。
在成功的 oauth 中,我创建了一个文件夹 MyAppFolder,并在其中创建了一个 media 文件夹。
这个想法是,用户将用他们想要的任何照片和视频填充这个media 文件夹,然后我的 web 应用程序会将它们获取并显示在页面上,以便用户获得他们媒体的聚合视图。我能够获取media 文件夹中的所有媒体文件。这是我的sn-p代码:
async function getGoogleDriveMedia({ user, credentials }) {
// await prepareDrive({ user, credentials });
const rootFolder = await getRootFolder({ user, credentials });
if (!rootFolder) {
return;
}
const client = await createOauthClient({ user, credentials });
const drive = google.drive({
version: 'v3',
auth: client,
});
const mediaFolderRes = await drive.files.list({
q: `mimeType='application/vnd.google-apps.folder' and name='media' and '${
rootFolder.id
}' in parents`,
fields: 'nextPageToken, files(id, name, parents)',
});
const mediaFolder = _.get(mediaFolderRes, 'data.files[0]');
if (!mediaFolder) {
return;
}
const mediaRes = await drive.files.list({
q: `'${
mediaFolder.id
}' in parents and (mimeType contains 'image/' or mimeType contains 'video/')`,
fields:
'nextPageToken, files(' +
[
'id',
'name',
'webContentLink',
'webViewLink',
].join(', ') +
')',
});
return _.get(mediaRes, 'data.files');
}
现在的问题是我无法显示这些媒体,因为它们不能公开访问。是否可以通过单一权限更新使MyAppFolder 及其中的所有内容可供公众访问?还是我需要每个文件都这样做?
我还在他们的 API 浏览器上检查了 fields.files 参数:https://developers.google.com/apis-explorer/#search/drive.files.list/m/drive/v3/drive.files.list
没有像 .previewLink 或其他图像 URL 字段之类的东西。
如何在我的网络应用上显示这些图片?
【问题讨论】:
-
您目前使用的是哪个云端硬盘范围?
-
使用每个文件的
thumbnailLink获取平铺图还不够?由于您对文件具有只读访问权限,因此您应该能够为经过身份验证的用户获取这些文件,并且如果用户单击一个,您可以获取全分辨率图像等。 -
我现在必须请求完整的驱动器范围。这里的问题是,当我在 UI 上提供要预览的媒体列表时,我没有获取文件,因为我会很快用完服务器上的存储空间并冒着流量成本的风险。我做了一个
drive.files.list,然后返回缩略图链接或文件链接。除非设置了只读权限,否则两者都无法成功放入<img />元素中。即使用户登录了他们的谷歌帐户,由于域不同,这仍然不会加载,谷歌上的 IAM 检查不会知道我的 UI 有一个经过身份验证的用户。
标签: node.js google-apps-script google-api google-oauth google-api-client