【问题标题】:MS Graph API copy folder of shared folder into the same parent won't copy subfolders and files共享文件夹的 MS Graph API 复制文件夹到同一个父级不会复制子文件夹和文件
【发布时间】:2021-05-21 17:20:32
【问题描述】:

上个月,我在我的 Angular Web 应用中设置了 Microsoft 服务集成,以访问公司的个人帐户 onedrive。因此,我们使用MSAL 作为身份验证服务,并使用来自msal-angularMSAL_INTERCEPTOR 来验证我们的请求。所有员工都将公司的 onedrive 作为共享驱动器。一切正常,但本周我收到反馈说应该使用新名称复制的模型文件夹没有创建子文件夹和文件。

让我展示我的工作流程,以使用另一个名称将模型文件夹复制到同一父文件夹中:

  1. 获取模型文件夹的元数据并保存父信息:
GET https://graph.microsoft.com/v1.0/drives/SHARED_DRIVE_ID/items/SHARED_DRIVE_ID!52853:/05-DRM/01-Em%20Andamento/ORC-000_ANO-NOME%20DO%20CONTRATO-GESTOR

response:
{
  ...
  "id": "SHARED_DRIVE_ID!110649",
  "lastModifiedDateTime": "2021-05-21T15:28:55.567Z",
  "name": "ORC-000_ANO-NOME DO CONTRATO-GESTOR",
  "size": 0,
  "webUrl": "https://1drv.ms/f/s!ABM9Mjoi6dy8huA5",
  ...
  "parentReference": {
    "driveId": "SHARED_DRIVE_ID",
    "driveType": "personal",
    "id": "SHARED_DRIVE_ID!95075",
    "name": "01-Em Andamento",
    "path": "/drives/SHARED_DRIVE_ID/items/SHARED_DRIVE_ID!52853:/05-DRM/01-Em%20Andamento"
  },
  "fileSystemInfo": { "createdDateTime": "2021-02-11T13:47:04Z", "lastModifiedDateTime": "2021-03-29T13:50:23.99Z" },
  "folder": {
    "childCount": 8,
    "view": { "viewType": "thumbnails", "sortBy": "takenOrCreatedDateTime", "sortOrder": "ascending" }
  },
  "shared": { "scope": "users", "owner": { "user": { "displayName": "Nortan Diretores", "id": "SHARED_DRIVE_ID" } } }
}

  1. 使用“parentReference”发出复制请求
POST https://graph.microsoft.com/v1.0/drives/SHARED_DRIVE_ID/items/SHARED_DRIVE_ID!52853:/05-DRM/01-Em%20Andamento/ORC-000_ANO-NOME%20DO%20CONTRATO-GESTOR:/copy

payload:
{
  "parentReference": { "driveId": "SHARED_DRIVE_ID", "id": "SHARED_DRIVE_ID!95075" },
  "name": "ORC-189_2021-Posto de Combustível 3M-Nichollas Gomes"
}

response:
Status Code: 202 Accepted
  1. 新复制的文件夹与模型文件夹的所有子文件夹和文件一起创建。

  2. 复制请求被接受四秒后(由于无法通知复制过程),我获取新文件夹的信息以获取Web URL。

此工作流程在我对员工个人 onedrive 文件夹的测试中运行,它也适用于我们的共享文件夹。但是现在,在共享文件夹中,当我们到达工作流程的第 4 步时,只会创建一个空的新文件夹。

试图了解发生了什么,我还注意到,当它在 onedrive 网站上发出复制请求时,显示复制操作稍后失败并出现以下错误:Error: Try again or refresh page,但我无法调试此错误.有办法调试这个错误吗?

编辑 1: 我使用Postman 在我的网络应用程序之外尝试了第 2 步,但发生了同样的问题。

编辑 2: 邮递员的请求响应:

Staus: 202Accepted    Time: 1596 ms    Size: 719 B

{
  "Date": "Sat, 22 May 2021 16:46:16 GMT",
  "Cache-Control": "no-store",
  "Transfer-Encoding": "chunked",
  "Location": "https://df.api.onedrive.com/v1.0/monitor/4s7kSj8n8-eF7gyNg40BOOKlQvmxjiQ9Yvana5Jl1l87mCOs4AGis4lO95DtmZaccjg-teKUNaY5EQtMya2RnjHfVY7DDbNXgCMYrQju89nzRdbwORmMhSxoy6mds4QfFOmAF92vSB7JL3J2456uxirjwjE3KCkN3KC9TfrJcxvGtFQU1VT7Euk6WMpoq3HeRcOwCtEP1GWuegI3qo1jFSj8PKoyIvTMrZ43snVoiBmjupBHiDlnTUsLkWzqUZ5v1X",
  "Strict-Transport-Security": "max-age=31536000",
  "request-id": "3a02e7bd-dbac-48e6-9a62-939ce0f2e3e0",
  "client-request-id": "3a02e7bd-dbac-48e6-9a62-939ce0f2e3e0",
  "x-ms-ags-diagnostic": {
    "ServerInfo": {
      "DataCenter": "Brazil South",
      "Slice": "E",
      "Ring": "3",
      "ScaleUnit": "000",
      "RoleInstance": "CP1PEPF00001A64"
    }
  }
}

【问题讨论】:

  • (1) 您所说的公司个人 onedrive 是什么意思 - 如果我没记错的话,您指的是公司为每位员工提供的 OneDrive for business? (2) 共享响应中的 Graph API 错误,以及 requestid、时间戳(来自邮递员或您的应用程序)
  • 我相信您知道在大多数情况下,复制操作是异步执行的。 API 的响应将仅表明复制操作被接受或拒绝,例如由于目标文件名已在使用中。因此,在上述情况下检查你是否结束是值得的。
  • (1) 不,我说的是个人 OneDrive。公司有一个个人账户,因为每个员工都有一个。对于南美的我们来说,购买 OneDrive 企业帐户太贵了。 (2) 这就是重点,没有错误。正如我所说,请求被接受,新文件夹是在正确的位置创建的,但是在复制文件夹文件时不知何故出现了内部错误。我将使用请求的信息更新我的问题
  • 是的,我知道这一点。我的方案是将基本文件夹复制到同一个父文件夹中没有名称冲突的新文件夹。当我在我的个人 OneDrive 文件夹中尝试相同的操作时,它按预期工作,但在公司共享文件夹中我遇到了这个问题
  • @Dev,我终于找到了问题所在。我作为答案发布了

标签: microsoft-graph-api onedrive


【解决方案1】:

最后,我弄清楚了问题所在。复制端点不处理使用项目作为基本路径的相对路径,例如:

POST https://graph.microsoft.com/v1.0/drives/SHARED_DRIVE_ID/items/SHARED_DRIVE_ID!52853:/05-DRM/01-Em%20Andamento/ORC-000_ANO-NOME%20DO%20CONTRATO-GESTOR:/copy

所以,我只是在我的工作流程中使用我在获取文件夹元数据以获取父信息时获得的项目 ID 更改了复制端点。现在我的复制请求是:

POST https://graph.microsoft.com/v1.0/drives/SHARED_DRIVE_ID/items/SHARED_DRIVE_ID!110649/copy

更改后我的复制操作监控结果是:

{
    "errorCode": "",
    "operation": "itemCopy",
    "percentageComplete": 100.0,
    "resourceId": "SHARED_DRIVE_ID!290908",
    "status": "completed",
    "statusDescription": "Completed 10/10 files; 15906/15906 bytes"
}

相反,

{
    "errorCode": "",
    "operation": "itemCopy",
    "percentageComplete": 0.0,
    "status": "notStarted",
    "statusDescription": "Completed 0/0 files; 0/0 bytes"
}

感谢@Dev 的所有支持。

【讨论】:

  • 很高兴收到@Kikuto 的回复!感谢您将决议发布回社区并投赞成票:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多