如何在单个 Google Drive 文件夹中访问所有文件?

How to make all files accessible in a single Google Drive folder?

我正在尝试访问由我的 webapp 使用 node.js (https://github.com/googleapis/google-api-nodejs-client/) 的官方 google api 库创建的文件夹中的媒体文件。

oauth 成功后,我创建了一个文件夹 MyAppFolder,并在其中创建了一个 media 文件夹。

这个想法是,用户将在这个 media 文件夹中放入他们想要的任何照片和视频,然后我的网络应用程序会将它们显示在一个页面上,以便用户获得他们媒体的聚合视图.我能够获取 media 文件夹中的所有媒体文件。这是我的代码片段:

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');
}

现在的问题是我无法显示这些媒体,因为它们 public 不可访问。是否可以通过一次权限更新使 MyAppFolder 及其中的所有内容可供 public 访问?或者我需要每个文件都这样做吗?

我还在他们的 API 浏览器上检查了 fields.files 参数:https://developers.google.com/apis-explorer/#search/drive.files.list/m/drive/v3/drive.files.list

没有 .previewLink 或其他图像 URL 字段。

如何在我的网络应用程序上显示这些图像?

Is it possible to make the MyAppFolder and everything within it accessible to the public with a single permissions update? Or do I need to do it per file?

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

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

注意:我希望您已通知您的用户他们的文件将被制作 public。

看看file.thumbnailLink。它的分辨率可能足以满足您的需要,并且它是 public。注意,恕我直言,它是 public 的事实是一个安全漏洞,可能会在未来的某个时候得到修复。

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