C# ASP.NET:如何利用Microsoft Graph返回的System.IO.Stream下载OneDrive文件
处理Microsoft Graph API返回的Stream完成OneDrive文件下载
嘿,你已经搞定了最关键的认证和文件定位环节,剩下把Stream转成本地文件就超轻松啦!我给你拆解具体步骤,附完整代码示例:
第一步:正确获取文件内容流
首先要确认调用Graph API获取Stream的代码是异步的(Graph的方法大多是异步设计),基本写法如下:
// 假设你已经初始化并授权好了graphClient实例 var graphFileStream = await graphClient.Me.Drive.Items["你的itemId"].Content.Request().GetAsync();
第二步:将Stream写入本地文件
拿到System.IO.Stream后,核心就是用.CopyToAsync()方法把它复制到本地文件流里。这里一定要用using语句包裹所有流对象,能自动释放资源,避免内存泄漏:
using System.IO; using Microsoft.Graph; public async Task DownloadOneDriveFile(string itemId, string localSavePath) { try { // 从Graph获取文件内容流 using (var graphStream = await graphClient.Me.Drive.Items[itemId].Content.Request().GetAsync()) { // 创建本地文件流,准备写入 using (var localFileStream = new FileStream(localSavePath, FileMode.Create, FileAccess.Write)) { // 异步复制流到本地文件 await graphStream.CopyToAsync(localFileStream); } } Console.WriteLine("文件下载完成!"); } catch (Exception ex) { Console.WriteLine($"下载出错:{ex.Message}"); } }
一些实用小提示
- 文件覆盖问题:上面代码用的
FileMode.Create会直接覆盖同名文件,如果不想覆盖,可以换成FileMode.CreateNew,但要注意捕获IOException(文件已存在时会抛出)。 - 文本文件特殊处理:如果下载的是纯文本文件,也可以用
StreamReader直接读取内容:using (var reader = new StreamReader(graphStream)) { string fileContent = await reader.ReadToEndAsync(); // 直接处理文本内容 } - 进度监控:如果需要显示下载进度,可以自己实现分块读取写入,比如每次读取固定字节数并计算已下载比例,但基础场景用
CopyToAsync就足够高效。
内容的提问来源于stack exchange,提问作者Azuraith
相关产品推荐
相关产品推荐

