【问题标题】:How to make all files accessible in a single Google Drive folder?如何使单个 Google Drive 文件夹中的所有文件都可以访问?
【发布时间】: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


【解决方案1】:

看看file.thumbnailLink。它可能有足够的分辨率来满足您的目的,并且是公开的。注意恕我直言,它是公开的事实是一个安全错误,可能会在将来的某个时候得到修复。

请注意,您的代码中存在错误。您正确地获取了nextPageToken,但是您并没有使用它来测试文件列表中是否还有更多需要获取的页面。

【讨论】:

  • 只有文件夹公开时才公开还是谷歌驱动器中的所有图片都公开?
  • 根据我的测试,缩略图似乎是公开的,无论权限如何
  • 哇哦。似乎是一个很大的隐私忽视。
  • 有趣,我会检查它们的尺寸,看看它们是否足够好,然后我可以请求只读权限。
【解决方案2】:

是否可以通过一次权限更新使 MyAppFolder 及其中的所有内容可供公众访问?还是我需要每个文件都这样做?

不,没有办法一次更新文件中的所有内容。您将不得不更新每个文件。即使更新文件夹也不会更改文件夹中文件的设置。

只需让您的应用程序在文件上传后更改文件的权限即可。同时运行所有现有文件并更改其权限。

注意:我希望您已通知您的用户,他们的文件将被公开。

【讨论】:

  • 是的,这是我不想做的事情,因为当我真正需要只读权限时,它要求我请求写权限。我想这是我必须非常清楚的事情,并且在触摸别人的文件时要小心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多