如何在C#控制台应用中用Graph API上传4MB以上附件
解决方案
核心问题修正
你代码里的CreateUploadSessionPostRequestBody用的是委派权限(Me路径)对应的类型,在应用权限环境下需要替换为Users路径对应的RequestBody类型,同时补充完整分块上传的逻辑。
完整修正代码
var resultdraft = await graphServiceClient.Users["xxxxxxxxx.com"].Messages.PostAsync(message); var messageId = resultdraft.Id; var fileInfo = new FileInfo(@"D:\downloadFiles\dfdsfdsfdscd.txt"); long fileSize = fileInfo.Length; using var fileStreamx = System.IO.File.OpenRead(@"D:\downloadFiles\dfdsfdsfdscd.txt"); // 替换为应用权限对应的RequestBody类型 var requestBody = new Microsoft.Graph.Users.Item.Messages.Item.Attachments.CreateUploadSession.CreateUploadSessionPostRequestBody { AttachmentItem = new AttachmentItem { AttachmentType = AttachmentType.File, Name = fileInfo.Name, // 使用实际文件名,而非硬编码 Size = fileSize, // 使用实际文件大小,而非硬编码数值 }, }; // 创建上传会话 var uploadSession = await graphServiceClient.Users["xxxxxxxxxx.com"].Messages[messageId].Attachments.CreateUploadSession.PostAsync(requestBody); // 使用LargeFileUploadTask执行分块上传 var uploadTask = new LargeFileUploadTask<FileAttachment>(uploadSession, fileStreamx, fileSize); var uploadResult = await uploadTask.UploadAsync(); if (uploadResult.UploadSucceeded) { Console.WriteLine("大附件上传成功"); } else { Console.WriteLine("大附件上传失败"); }
关键说明
- RequestBody类型替换:应用权限下必须使用
Users.Item.Messages.Item.Attachments.CreateUploadSession.CreateUploadSessionPostRequestBody,而非Me路径的类型,否则会出现权限或路径不匹配的问题。 - 分块上传逻辑:创建上传会话后,需要通过
LargeFileUploadTask来完成实际的分块上传操作,这是处理大于4MB附件的必要步骤。 - 权限要求:确保你的应用已配置
Mail.ReadWrite应用权限,并且已完成管理员同意。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

