2016-03-15 121 views
0

我有2個OneDrive帳戶。 帳戶A與帳戶B共享一個文件夾。 我使用帳戶B登錄並希望通過REST將帳戶A的共享文件夾複製到帳戶B中的文件夾。OneDrive API(REST),在不同的OneDrive帳戶之間複製文件/文件夾

我知道OneDrive直播SDK文檔說: https://msdn.microsoft.com/en-us/library/dn659743.aspx

複製操作的目標必須是一個文件夾。文件夾本身不能被複制。此外,OneDrive存儲的結構使得複製操作不會發生在不同用戶的OneDrive文件夾層次結構之間。例如,即使用戶A可以閱讀用戶B的文件,用戶A也不能將其複製到他或她自己的OneDrive文件夾中。

我不使用實時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"} 
} 

enter image description here

當我想通過Fiddler中的REST訪問帳戶A的文件夾時,我得到以下錯誤。

REST調用:

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"} 
} 

enter image description here

錯誤響應:

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

我使用的範圍是:

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

回答

0

我想我已經找到了答案。

當帳戶A與帳戶B共享一個文件夾時,共享文件夾確實出現在帳戶B的「共享」下!

所以我只是要得到這個文件夾的ID在「共享」將其複製到我的首選目標文件夾的賬戶B.

enter image description here

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"} 
} 

enter image description here

如果有人有興趣通過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);