Как загрузить в OneDrive с помощью Microsoft Graph Api в c# - PullRequest
0 голосов
/ 17 апреля 2020

Я пытался загрузить данные в учетную запись OneDrive, и я безнадежно застрял, не имея возможности загружать файлы размером не более 4 МБ. У меня нет проблем с доступом к диску вообще, так как у меня есть рабочие функции, которые создают папку, переименовывают файлы / папки и удаляют файлы / папки.

https://docs.microsoft.com/en-us/graph/api/driveitem-put-content?view=graph-rest-1.0&tabs=csharp

Эта документация по Microsoft Graph API очень дружественна к HTTP-коду, и я считаю, что могу довольно «перевести» документацию на C#, но все равно не удается получить файл и загрузить его в OneDrive. Кажется, в некоторых местах онлайн используются байтовые массивы? Что мне совершенно незнакомо, так как мой основной язык - C ++, и мы просто используем ifstream / ofstream. В любом случае, вот часть кода в спецификациях c (надеюсь, этого достаточно):

var item = await _client.Users[userID].Drive.Items[FolderID]//"01YZM7SMVOQ7YVNBXPZFFKNQAU5OB3XA3K"].Content
                    .ItemWithPath("LessThan4MB.txt")//"D:\\LessThan4MB.txt")
                    .CreateUploadSession()
                    .Request()
                    .PostAsync();
            Console.WriteLine("done printing");

В существующем состоянии он загружает временный файл с тильдой "~" в OneDrive ( как будто я мог только открыть, но не импортировать данные из файла на него). Если я меняю имя файла так, чтобы оно включало в себя местоположение файла, оно выдает ошибку:

Сообщение: обнаружена функция 'microsoft.graph.createUploadSession' для открытого свойства. Функции открытых свойств не поддерживаются.

Спасибо, любые комментарии и помощь будут много значить.

1 Ответ

0 голосов
/ 17 апреля 2020

Попробуйте этот подход с потоком памяти и запросом PutAsync<DriveItem>:

string path = "D:\\LessThan4MB.txt";
byte[] data = System.IO.File.ReadAllBytes(path);

using (Stream stream = new MemoryStream(data))
{
    var item = await _client.Me.Drive.Items[FolderID]
            .ItemWithPath("LessThan4MB.txt")
            .Content
            .Request()
            .PutAsync<DriveItem>(stream);
}

Я предполагаю, что вы уже предоставили Microsoft Graph Files.ReadWrite.All разрешение. Проверьте ваше разрешение API . Я тестировал этот фрагмент кода с довольно старой версией библиотеки Microsoft.Graph версии 1.21.0. Надеюсь, это сработает и для вас.

...