将文件上传到 Sharepoint 在线库

Uploading A File to a Sharepoint Online Library

我尝试使用 C# graph sdk 将文件上传到 Sharepoint 在线文档库,但失败了。

我可以获取 drive/library,但如果我将其作为驱动器获取,则 Root 为空,我会遇到异常。如果我将它作为一个列表来处理,我似乎无法使用 CreateUploadSession 方法。

获取文档库作为列表有效:

await graphClient.Sites[SPUrl + ":"].Sites[SpPath + ":"].Lists[libId].Request().GetAsync();

通过驱动器 ID 将文档库作为驱动器获取似乎不起作用:

var drive = await graphClient.Sites[SPUrl + ":"].Sites[SpPath + ":"].Drives[driveId].Request().GetAsync();

将文档库作为其列表的驱动器获取:

var drive = await graphClient.Sites[SPUrl + ":"].Sites[SpPath + ":"].Lists[libId].Drive.Request().GetAsync();

但是尝试获取该驱动器的根会导致 "bad request: URL specified is invalid." 尝试 Drive.Items.Request() 也是如此。但据我所知,我需要有驱动器的根目录才能执行此操作:

var uploadSession = await graphClient.Sites[SPUrl + ":"].Sites[SpPath + ":"].Lists[libId].Drive.Root.ItemWithPath(file.FileName).CreateUploadSession().Request().PostAsync();

但是我有三个文档库,它们都将根目录显示为空。显然我遗漏了一些东西,但我不清楚是什么。

确实,如果站点是 addressed by server-relative URL,则以下查询

GET https://graph.microsoft.com/v1.0/sites/{hostname}:/{server-relative-path}:/drive

成功并且 returns 默认驱动器,而以下内容:

GET https://graph.microsoft.com/v1.0/sites/{hostname}:/{server-relative-path}:/drive/root

失败并且 returns 错误 Url specified is invalid.

这似乎是 Microsoft Graph 本身的 错误。 无论如何,可以考虑使用以下选项将文件上传到库中。

It is assumed siteUrl corresponds to site server relative url and listId to library unique identifier

它包括以下步骤:

  • 通过相对服务器解析站点 url
  • 访问库的根文件夹
  • 上传文件

例子

//1.resolve site by server relative url
var targetSite = await graphClient.Sites.GetByPath(siteUrl,hostName).Request().GetAsync();    //2.access root folder for for a Library
var targetFolder = graphClient.Sites[targetSite.Id]
       .Lists[listId]
       .Drive
       .Root;

 //3.Upload a file
 var pathToFile = @"c:\Temp\Guide.docx";
 using (var fileStream = new FileStream(pathToFile, FileMode.Open, FileAccess.Read))
 {
      var uploadedItem = await targetFolder
        .ItemWithPath("Guide.docx")
        .Content
        .Request()
        .PutAsync<DriveItem>(fileStream);
 }

哪里

  • hostName 是网站集主机名(例如 contoso.sharepoint.com)
  • siteUrl - 服务器相关站点 url,例如/sites/management