从字节数组上传文件至SharePoint Online时遇“File Not found”错误
我帮你梳理下这个上传报错的问题,结合你给出的代码片段来看,大概率是这几个环节出了问题,咱们一步步排查解决:
1. 目标文件夹路径不匹配或不存在
你传入的folderName很可能不是SharePoint能识别的完整服务器相对路径,比如只传了子文件夹名,而没带上站点和文档库前缀(比如/sites/你的站点名/文档库名称/子文件夹),这会导致SharePoint找不到上传目标,进而抛出“File Not found”的误导性错误。
解决方法:先验证并确保目标文件夹存在,不存在就先创建:
using (ClientContext ctx = new ClientContext(sp.siteUrl)) { ctx.Credentials = new SharePointOnlineCredentials(sp.id, securePwd); // 加载目标文件夹并验证存在性 Folder targetFolder = ctx.Web.GetFolderByServerRelativeUrl(folderName); ctx.Load(targetFolder); ctx.ExecuteQuery(); if (!targetFolder.Exists) { // 递归创建层级文件夹 ctx.Web.Folders.Add(folderName); ctx.ExecuteQuery(); } // 后续上传逻辑写在这里 }
2. ClientContext初始化与操作流程不完整
从你的代码片段看,只完成了Credentials的初始化,但缺少ClientContext的创建以及必要的ExecuteQuery()调用——SharePoint CSOM需要通过ExecuteQuery()来执行服务器端操作,不执行的话对象状态不会同步,也会导致找不到目标资源。
正确的上传流程应该是:创建ClientContext → 绑定权限 → 定位目标文件夹 → 构建文件上传信息 → 执行上传并同步状态。
3. 文件上传时的路径拼接错误
上传文件时如果直接使用文件名,没有和目标文件夹路径正确拼接,SharePoint会默认在站点根目录找文件,而不是你期望的文档库文件夹,这也会触发“File Not found”错误。
正确的文件上传代码示例:
// 构建上传信息 FileCreationInformation fileInfo = new FileCreationInformation(); fileInfo.Content = fileContent; // 确保路径是文件夹+文件名的完整相对路径 fileInfo.Url = Path.Combine(folderName, fileNameWithExtension); fileInfo.Overwrite = true; // 允许覆盖已有文件 // 上传文件到目标文件夹 Microsoft.SharePoint.Client.File uploadFile = targetFolder.Files.Add(fileInfo); ctx.Load(uploadFile); ctx.ExecuteQuery(); // 必须执行这一步完成上传 result = true;
4. 权限不足导致的误导性错误
有时候SharePoint会把权限不足的错误包装成“File Not found”,所以要确认你使用的账号sp.id拥有目标文档库的编辑权限(包括创建文件夹、上传文件的权限)。可以换一个有站点管理员权限的账号测试,排除权限问题。
5. 完善异常捕获,获取真实错误信息
你当前的异常捕获逻辑不完整,建议专门捕获ClientRequestException,它会返回SharePoint服务器的详细错误响应,能帮你精准定位问题:
try { // 上传逻辑 } catch (ClientRequestException ex) { log.Error($"SharePoint上传错误详情: {ex.Message}, 服务器响应: {ex.Response}"); } catch (Exception ex) { log.Error($"文件上传失败: {ex.Message}"); }
内容的提问来源于stack exchange,提问作者user576510

