c# - 如何在 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”。不支持打开属性的函数。
谢谢,任何评论和帮助都意义重大。
解决方案
使用内存流和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 测试了这个代码片段。希望它也对你有用。
推荐阅读
- sql - 基于优先级表消除重复记录
- java - 在使用 Matlab 中的库编译器打包的 java 中运行 Matlab 代码时出现库错误
- macos - 如何使用 CMake 为早期版本的 MacOS 构建二进制文件?
- r - 使用 tidyverse 在函数中获取特定的列名
- python - OperationalError:没有这样的模块:fts4?Python中的SQLite也没有可用的扩展
- c - 链表没有删除/添加第一个头
- javascript - 承诺返回未定义 - 打字稿
- c# - 如果我使用 PBKDF2 或 RFC2898 代码在 C# 中加密或解密数据,是否不需要存储哈希密码
- java - 通过网络进行序列化时列表中元素的顺序
- ansible - Ansible 最佳实践 - 何时使用“ini_file”模块而不是“copy”