将文件上传到Sharepoint联机库

时间:2019-01-18 22:37:03

标签: c# asp.net azure microsoft-graph sharepoint-online

我正在尝试并且无法使用C#图形sdk将文件上传到Sharepoint在线文档库。

我可以获取驱动器/库,但是如果以驱动器的形式获取,则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();

但是,尝试获取该驱动器的根目录将导致“请求错误:指定的URL无效”。尝试Drive.Items.Request()也是如此。但据我所知,我需要拥有驱动器的根才能做到这一点:

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

但是我有三个文档库,它们都显示Root为null。显然我缺少了一些东西,但不清楚。

1 个答案:

答案 0 :(得分:0)

实际上,如果站点为addressed by server-relative URL,则以下查询

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

成功并返回默认驱动器,同时显示以下内容:

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

失败并返回错误Url specified is invalid.

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

  

假设siteUrl对应于站点服务器相对URL,并且   listId来存储唯一标识符

它包含以下步骤:

  • 通过服务器相对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-服务器相对站点的网址,例如/sites/management