Я пытаюсь и не могу загрузить файл в онлайн-библиотеку документов Sharepoint с помощью C# graph sdk.
Я могу получить диск/библиотеку, но если я получу его как диск, Root будет нулевым, и я получу исключение. Если я обращаюсь к нему как к списку, я не могу использовать метод CreateUploadSession.
Получение библиотеки документов в виде списка работает:
await graphClient.Sites[SPUrl + ":"].Sites[SpPath + ":"].Lists[libId].Request().GetAsync();
Получение библиотеки документов в виде диска по идентификатору диска не работает:
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. Явно что-то упускаю, но не понимаю что.
Действительно, если сайт адресуется по 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. В любом случае можно рассмотреть следующий вариант загрузки файла в библиотеку.
It is assumed
siteUrl
corresponds to site server relative url andlistId
to library unique identifier
Он состоит из следующих шагов:
Пример
//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