首页 > 解决方案 > 如何在 c# 中使用 Microsoft Graph Api 上传到 OneDrive

问题描述

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

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

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”。不支持打开属性的函数。

谢谢,任何评论和帮助都意义重大。

标签: c#file-uploadmicrosoft-graph-api

解决方案


使用内存流和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 测试了这个代码片段。希望它也对你有用。


推荐阅读