如何在 C# 中使用 Microsoft Graph Api 上传到 OneDrive

MIC*_*EZ1 5 c# file-upload microsoft-graph-api

我一直在尝试上传到 OneDrive 帐户,但无法上传小于或大于 4MB 的文件,我陷入了绝望的境地。我访问驱动器完全没有问题,因为我有创建文件夹、重命名文件/文件夹和删除文件/文件夹的工作功能。

https://learn.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。无论如何,这是具体的代码部分(我希望这已经足够了):

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

就目前情况而言,它会上传一个在 OneDrive 中带有波形符“~”的临时文件(就好像我只能打开但无法将文件中的任何数据导入到其中一样)。如果我交换文件名,使其包含文件位置,则会引发错误:

消息:在开放属性上找到函数“microsoft.graph.createUploadSession”。不支持开放属性上的函数。

小智 5

使用内存流和请求尝试这种方法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);
}
Run Code Online (Sandbox Code Playgroud)

我假设您已经授予 Microsoft Graph Files.ReadWrite.All权限。检查您的 API 权限。我使用相当旧的 Microsoft.Graph 库版本 1.21.0 测试了此代码片段。希望它也对你有用。