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

如何在.NET Core项目中通过REST API为SharePoint列表项上传附件

SharePoint列表项附件上传(.NET Core REST API实现方案)

核心实现思路

  • 直接复用你现有项目中已经调试通的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:18:03