如何使用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
相关产品推荐
相关产品推荐

