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

如何使用ASP.NET MVC上传文件至OneDrive?认证后仍失败求助

OneDrive 文件上传失败问题排查与修复方案

核心问题分析

你的代码存在三个关键问题,导致无法成功创建上传会话完成文件上传:

  • Content-Type 设置错误:创建上传会话的接口要求使用 application/json,而非你当前设置的 application/octet-stream
  • 缺少必要的请求体:该接口必须携带JSON格式的请求体,用于指定文件冲突处理策略等配置
  • 未完成完整上传流程:代码仅初始化了请求对象,没有发送请求获取上传会话URL,也未执行后续的文件上传步骤

修正后的完整代码示例

var folderName = "YourFolderName"; 
var fileName = file.FileName;
var url = $"https://api.onedrive.com/v1.0/drive/me/root:/{folderName}/{fileName}:/upload.createSession";

// 初始化创建上传会话的请求
var sessionRequest = (HttpWebRequest)WebRequest.Create(url);
sessionRequest.Method = "POST";
sessionRequest.Headers.Add("Authorization", "Bearer " + accessToken);
sessionRequest.ContentType = "application/json";

// 构造请求体,指定文件冲突处理策略(replace表示覆盖同名文件)
var requestBody = new {
    "@microsoft.graph.conflictBehavior" = "replace",
    name = fileName
};
string jsonBody = Newtonsoft.Json.JsonConvert.SerializeObject(requestBody);

// 写入请求体并发送请求
using (var streamWriter = new StreamWriter(sessionRequest.GetRequestStream()))
{
    streamWriter.Write(jsonBody);
}

// 获取上传会话响应,拿到用于上传的uploadUrl
using (var sessionResponse = (HttpWebResponse)sessionRequest.GetResponse())
using (var reader = new StreamReader(sessionResponse.GetResponseStream()))
{
    var sessionData = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(reader.ReadToEnd());
    string uploadUrl = sessionData.uploadUrl;

    // 执行文件上传(示例为直接上传整个文件,适用于100MB以下的小文件)
    var uploadRequest = (HttpWebRequest)WebRequest.Create(uploadUrl);
    uploadRequest.Method = "PUT";
    uploadRequest.ContentType = System.Web.MimeMapping.GetMimeMapping(fileName);

    // 将文件流写入上传请求
    using (var fileStream = file.InputStream)
    using (var requestStream = uploadRequest.GetRequestStream())
    {
        fileStream.CopyTo(requestStream);
    }

    // 处理上传结果
    using (var uploadResponse = (HttpWebResponse)uploadRequest.GetResponse())
    {
        if (uploadResponse.StatusCode == HttpStatusCode.Created)
        {
            // 上传成功,可在此处理后续逻辑
        }
    }
}

额外注意事项

  • 确保你的accessToken已申请Files.ReadWrite或更高权限的范围,权限不足会导致上传失败
  • 若上传大文件(超过100MB),需要采用分块上传,每个块大小建议设置在5MB到60MB之间,并在请求头中指定Content-Range
  • 需添加异常捕获逻辑,处理权限失效(401)、路径不存在(404)、文件过大等常见错误场景

内容的提问来源于stack exchange,提问作者anh trantrunghoang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:13:30