使用Graph Service Client上传大文件至SharePoint Online内容缺失问题排查
问题排查与修复方案
问题现象
上传20MB、30MB级PDF文件时,通过创建上传会话分片上传,将Base64字符串转成MemoryStream后设置分片大小为320KB,但上传后文件不完整(例如原文件35303569字节,仅上传35061760字节),过程无报错。
代码中的问题点
- 变量名拼写错误:定义分片大小的变量名是
maxschinksize,但创建LargeUploadTask时传入的是maxchunksize,导致实际使用的分片大小不是预期的320KB,进而遗漏最后一段数据。 - Progress对象语法错误:创建
IProgress<long>时缺少闭合括号,这会导致编译失败,需修正语法。 - 未验证上传结果:上传完成后未检查
uploadResult的状态,无法确认上传是否真的完成,也无法捕获潜在异常。
修复后的完整代码
using (var ms = new MemoryStream()) { byte[] bytes = System.Convert.FromBase64String(data); ms.Write(bytes, 0, bytes.Length); ms.Seek(0, SeekOrigin.Begin); var uploadSession = await graphclient.Sites[SiteId].Drive.Root.ItemWithPath(docfilename).CreateUploadSession().Request().PostAsync(); // 修正变量名拼写错误 var maxchunksize = 320 * 1024; var largeuploadtask = new LargeUploadTask<DriveItem>(uploadSession, ms, maxchunksize); // 修正Progress对象语法错误,可添加进度日志方便排查 IProgress<long> uploadProgress = new Progress<long>(uploadbytes => { Console.WriteLine($"已上传 {uploadbytes} 字节"); }); var uploadResult = await largeuploadtask.UploadAsync(uploadProgress); // 验证上传结果状态 if (uploadResult.UploadSucceeded) { Console.WriteLine("文件上传成功"); } else { Console.WriteLine($"上传失败,错误信息:{uploadResult.Error.Message}"); } }
额外排查建议
- 确认
data对应的Base64字符串完整,无截断或损坏。 - 在写入MemoryStream后,打印
ms.Length确认与原文件字节数一致,排除Base64转换环节的问题。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

