如何在.NET Core项目中通过REST API为SharePoint列表项上传附件
核心实现思路
- 直接复用你现有项目中已经调试通的SharePoint认证逻辑,获取有效访问令牌后,所有请求Header统一携带
Authorization: Bearer {access_token} - 上传用SharePoint原生REST端点,格式为:
https://{你的站点域名}/sites/{站点名}/_api/web/lists/getbytitle('{列表名}')/items({列表项ID})/AttachmentFiles/add(FileName='{要保存的文件名}') - 请求类型为POST,需额外携带
X-RequestDigest值,该值可以调用/_api/contextinfo接口POST请求获取,你之前做列表POST请求的逻辑如果已经有获取方法可以直接复用 - 请求Body直接传入文件二进制流,
Content-Type统一设置为application/octet-stream即可
具体代码实现
1. 复用已有令牌获取逻辑,拿到有效access token
2. 实现X-RequestDigest获取方法
using System.Net.Http; using System.Net.Http.Headers; using Newtonsoft.Json.Linq; public async Task<string> GetRequestDigest(string siteUrl, string accessToken) { using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await client.PostAsync($"{siteUrl}/_api/contextinfo", null); response.EnsureSuccessStatusCode(); var contentStr = await response.Content.ReadAsStringAsync(); return JObject.Parse(contentStr)["d"]["GetContextWebInformation"]["FormDigestValue"].ToString(); }
3. 实现附件上传方法
public async Task UploadAttachmentToListItem(string siteUrl, string listName, int listItemId, string fileName, Stream fileStream, string accessToken) { // 文件名转义避免特殊字符导致请求异常 var encodedFileName = Uri.EscapeDataString(fileName); var uploadApiUrl = $"{siteUrl}/_api/web/lists/getbytitle('{listName}')/items({listItemId})/AttachmentFiles/add(FileName='{encodedFileName}')"; var requestDigest = await GetRequestDigest(siteUrl, accessToken); using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json;odata=verbose")); client.DefaultRequestHeaders.Add("X-RequestDigest", requestDigest); // 如果上传大文件可以调整超时时间 client.Timeout = TimeSpan.FromMinutes(5); var requestContent = new StreamContent(fileStream); requestContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); var response = await client.PostAsync(uploadApiUrl, requestContent); // 抛异常处理请求失败场景,可根据业务需要自定义错误处理逻辑 response.EnsureSuccessStatusCode(); }
注意事项
- 如果上传文件大于4MB,需要改用分块上传接口,依次调用
startupload、continueupload、finishupload三个端点分段传输,避免请求大小超限 - 确保你在Azure AD注册的应用已经配置了
Lists.Write权限,否则会返回403无权限错误 - 如果需要覆盖同名附件,可以在请求Header中添加
If-Match: *即可
内容的提问来源于stack exchange,提问作者Deep Ponkiya
相关产品推荐
相关产品推荐

