You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:14