【问题标题】:OneDrive API (REST), Copy Files/Folder between different OneDrive AccountsOneDrive API (REST),在不同 OneDrive 帐户之间复制文件/文件夹
【发布时间】:2023-03-10 15:20:01
【问题描述】:

我有 2 个 OneDrive 帐户。 账户 A 与账户 B 共享一个文件夹。 我使用帐户 B 登录,并想通过 REST 将帐户 A 的共享文件夹复制到帐户 B 中的文件夹。

我知道 OneDrive Live SDK 文档说: https://msdn.microsoft.com/en-us/library/dn659743.aspx

复制操作的目标必须是文件夹。不能复制文件夹本身。此外,OneDrive 存储的结构使得复制操作不会在不同用户的 OneDrive 文件夹层次结构之间发生。例如,即使用户 A 可以读取用户 B 的文件,用户 A 也无法将它们复制到自己的 OneDrive 文件夹中。

我没有使用 Live API https://apis.live.net/v5.0/,而是使用 OneDrive API https://api.onedrive.com/v1.0/

当我将文件夹复制到我自己的 OneDrive 中的文件夹时,一切都很好:

POST https://api.onedrive.com/v1.0/drive/root:/test:/action.copy

Authorization: Bearer {ACCESS TOKEN}
Content-Type: application/json
Prefer: respond-async

{
 "parentReference" : {"path": "/drive/root:/target"}
}

当我想通过 Fiddler 中的 REST 访问帐户 A 的文件夹时,我收到以下错误。

休息电话:

POST https://api.onedrive.com/v1.0/drives/38A2C8D42D476A18/root:/test:/action.copy

Authorization: Bearer {ACCESS TOKEN}
Content-Type: application/json
Prefer: respond-async

{
 "parentReference" : {"path": "/drive/root:/target"}
}

错误响应:

{"error":{"code":"itemNotFound","message":"Item does not exist"}}

我使用的范围是:

  • onedrive.readwrite
  • wl.signin
  • wl.skydrive
  • wl.skydrive_update
  • wl.contacts_skydrive

【问题讨论】:

    标签: rest fiddler onedrive


    【解决方案1】:

    我想我已经找到了答案。

    当账户 A 与账户 B 共享文件夹时,共享文件夹会出现在账户 B 的“共享”下!

    所以我只需在“共享”中获取此文件夹的 ID 即可将其复制到帐户 B 上的首选目标文件夹中。

    POST https://api.onedrive.com/v1.0/drive/items/FOLDER-ID/action.copy
    
    Authorization: Bearer {ACCESS TOKEN}
    Content-Type: application/json
    Prefer: respond-async
    
    {
     "parentReference" : {"path": "/drive/root:/target"}
    }
    

    如果有人有兴趣通过 C# 执行此 REST CALL,只需使用 RestSharp http://restsharp.org/。下面是 C# 代码片段

    RestRequest restRequest = new RestRequest(Method.POST);
    restRequest.AddHeader("Authorization", "Bearer " + accessToken);
    restRequest.AddHeader("Prefer", "respond-async");
    restRequest.AddParameter("application/json; charset=utf-8", "{\"parentReference\": {\"path\": \"/drive/root:/target\"}}", ParameterType.RequestBody);
    RestClient client = new RestClient("https://api.onedrive.com/v1.0/drive/items/FOLDER-ID/action.copy");
    IRestResponse _response = client.Execute(restRequest);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      相关资源
      最近更新 更多