【问题标题】:Download File from OneDrive using REST API使用 REST API 从 OneDrive 下载文件
【发布时间】:2020-07-04 17:42:43
【问题描述】:

我正在尝试使用节点 js 从用户的 Microsoft OneDrive 中获取文件列表(我感兴趣的 xlsx 和 CSV 文件)。从列表中选择文件,然后将其下载到本地系统中。

我可以查看有关使用 OneDrive REST API here 的 Microsoft 文档。但是,由于我是新手,所以我真的无法解决这个问题。任何帮助将不胜感激。

我想做一些类似于我们可以使用 Google Drive 做的事情,我可以在其中获取文件列表及其名称和唯一 ID,当用户选择一个文件时,通过使用唯一 ID,我能够下载所需的文件。我想知道 OneDrive 是否可以做类似的事情。

我目前的进展:

  1. 我可以要求用户提供他们的同意并获取代码以返回重定向 Uri(在我的情况下为 localhost)。

执行此操作的链接-https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={my_client_id}&scope=User.Read%20offline_access%20Files.ReadWrite.all%20Files.ReadWrite&response_type=code&response_mode=query&redirect_uri=https://localhost:3400

  1. 拿到代码后,我用它换了刷新令牌。

为了进行这种交换,我使用 Postman 进行 POST 请求。该网址是https://login.microsoftonline.com/common/oauth2/v2.0/token?grant_type=authorization_code&client_id=your_app_client_id&code=use_the_code_returned_on_previous_step

  1. 现在我有了一个刷新令牌,我想做一些操作,比如列出我的 OneDrive 上的文件并选择要下载的任何人。

【问题讨论】:

  • 我至少尝试搜索相关资源以开始使用 OneDrive API 工作。我发现(这个例子)[gist.github.com/tanaikech/22bfb05e61f0afb8beed29dd668bdce9] by Tanaikech,它是关于上传文件的。我能够生成 refresh_tokens 并进行身份验证。但是,仍然无法上传,因为它显示“拒绝访问”。我已经交叉检查了 Files.ReadWrite.all 范围也包括在内。真的无法进一步破解。
  • 您是否在 AAD 中的应用注册以及获取不记名令牌的调用中都包含范围(或使用 graph.microsoft.com/.default)?我认为人们需要更多地了解您在通话中发送的内容(在问题中嵌入代码,不要发送链接)。评论中的链接也不起作用,仅供参考。
  • @socasanta,是的,我在 AAD 中的应用注册期间和我的 API 调用期间都包含了范围。另外,感谢您指出该链接不起作用。这是正确的链接:gist.github.com/tanaikech/… 而且,我选择不在问题本身中提及该代码,以免偏离实际问题,因为我的最终目标是下载文件,而这个示例是关于上传文件的。我想将此作为我正在寻找的解决方案的示例。
  • 您应该有 2 个令牌进入 /token 响应 - access_token 和 refresh_token。您应该使用 access_token(而不是 refresh_token)进行操作。 (你说的是 refresh_token,所以我澄清一下)。
  • 是的。对于每个操作,我都需要访问令牌,但由于它们是短暂的,因此为了更大的利益,我提到了刷新令牌,因为它们可用于为每个操作获取新的访问令牌。谢谢你说得更清楚。 :) 对列出 OneDrive 中的文件或/和下载文件有任何帮助吗?

标签: node.js rest google-drive-api microsoft-graph-api onedrive


【解决方案1】:

我建议如下查看 Graph API,并使用上面收到的相同 auth_token。除了 /me,您也可以替换为用户 ID。

获取有关用户驱动器的信息: 获取https://graph.microsoft.com/v1.0/me/drive

获取驱动的根文件夹: 获取https://graph.microsoft.com/v1.0/me/drive/root/

注意:JSON 结果中的文档和路径显示为“root:”,但我无法让它与冒号一起使用。

嵌入到你应该看到的结果中:

"folder": {
    "childCount": {whatever the count is}
  },

查看文件夹中的文件: 获取https://graph.microsoft.com/v1.0/me/drive/root/children

文件将有一个 id 和一个名称,两者都可以用来检索它们:

"createdDateTime": "2020-07-05T18:08:37Z",
      "eTag": "\"{29C06DFA-92AE-48D5-AF3D-149EF959030F},1\"",
      "id": "01EC2X7VP2NXACTLUS2VEK6PIUT34VSAYP",
      "lastModifiedDateTime": "2020-07-05T18:08:37Z",
      "name": "wizard of wor.png",

按 ID 下载文件: https://graph.microsoft.com/v1.0/me/drive/items/01EC2X7VP2NXACTLUS2VEK6PIUT34VSAYP/content

或通过路径(在Wor.png下面的示例中是文件名): https://graph.microsoft.com/v1.0/me/drive/root/children/Wizard%20of%20Wor.png/content

文档来源: https://docs.microsoft.com/en-us/graph/api/driveitem-list-children?view=graph-rest-1.0&tabs=http https://docs.microsoft.com/en-us/graph/api/driveitem-get-content?view=graph-rest-1.0&tabs=http

【讨论】:

  • 非常感谢您的帮助!真的很感激。我已经可以在 Microsoft Docs 中看到这些 REST API 请求。当然,您帮助获得了更清晰的画面。但是,我正在寻找的是在 nodejs 中使用它。基本上,如何编写代码以列出所有文件(从层次结构的所有级别,而不仅仅是我通过其父文件夹 id 的文件)并选择其中任何一个以将其下载到我的系统上的给定位置。
  • 这是调用 API 以获取根节点的问题,如我在上面描述的那样列出该文件夹中的项目(/root/children)并编写一些代码 - 递归或其他模式来处理/显示它。那时它是 Typescript/Javascript 基础。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2017-06-18
  • 2019-01-08
  • 2020-09-05
相关资源
最近更新 更多