使用 Graph API 从 PlannerTask 下载 externalReference

Download an externalReference from PlannerTask using the Graph API

我想下载一个附加到 PlannerTask 的文件。我已经有了 ,但我不知道如何访问该文件。

外部引用是这样的 JSON 对象:

{
  "https%3A//contoso%2Esharepoint%2Ecom/sites/GroupName/Shared%20Documents/AnnualReport%2Epptx":
  {
    // ... snip ...
  }
}

我尝试使用以下端点

GET /groups/{group-id}/drive/root:/sites/GroupName/Shared%20Documents/AnnualReport%2Epptx

但我收到 404 响应。实际上,当我在 Graph Explorer 中使用查询时,它会警告我“URL 中的无效空格”(?)。

我发现的解决方法是使用 search 端点来查找这样的文件:

GET /groups/{group-id}/drive/root/search(q='AnnualReport.pptx')

希望文件名是唯一的。

无论如何,对于这两种方法,我都需要额外的信息(即 group-id),这些信息在我拥有外部引用对象时可能无法轻易获得。

为 PlannerTask 中的外部引用对象引用的 driveItem 下载 url 的正确方法是什么?

我真的需要组 ID 才能访问此类文件吗?

外部引用中的键是 webUrl 个实例,因此它们可以与 /shares/ 端点一起使用。有关如何操作的详细信息,请参阅

当您获得 driveItem 对象时,可从 AdditionalData 下载 url:driveItem.AdditionalData["@microsoft.graph.downloadUrl"]。您可以使用 WebClient.DownloadFiledownload the file on the local machine.

这是最终代码:

var remoteUri = "https%3A//contoso%2Esharepoint%2Ecom/sites/GroupName/Shared%20Documents/AnnualReport%2Epptx";
var localFile = "/tmp/foo.pptx";

string sharingUrl = remoteUri;
string base64Value = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sharingUrl));
string encodedUrl = "u!" + base64Value.TrimEnd('=').Replace('/','_').Replace('+','-');

DriveItem driveItem = m_graphClient
    .Shares[encodedUrl]
    .DriveItem
    .Request()
    .GetAsync().Result;

using (WebClient client = new WebClient())
{
    client.DownloadFile(driveItem.AdditionalData["@microsoft.graph.downloadUrl"].ToString(), 
                        localFile);
}