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

如何用C#同步SharePoint Online MySite用户头像至本地文件服务器?

SharePoint用户头像同步到本地文件服务器的实现方案

一、连接My Site的ClientContext

直接用My Site的根URL创建ClientContext即可,无需指定子站点:

var context = new ClientContext("https://<tenant_name>-my.sharepoint.com");
// 此处添加你的身份验证逻辑(如OAuth、用户名密码验证等)

二、定位存储头像的特殊列表

用户头像存储在名为User Photos的图片库中,这个库本质是SharePoint的特殊列表,你可以通过两种方式获取:

  • 直接通过列表标题获取:
var userPhotosLib = context.Web.Lists.GetByTitle("User Photos");
  • 若担心标题变动,可通过图片库模板类型(ID为109)筛选:
context.Load(context.Web.Lists, lists => lists.Include(l => l.Title, l => l.Id).Where(l => l.BaseTemplate == 109));
context.ExecuteQuery();
var userPhotosLib = context.Web.Lists.First(l => l.Title == "User Photos");

三、加载头像数据的方法

User Photos库没有现成可用的视图,但标准List方法完全适用,你可以用CAML查询筛选有效头像文件:
用户头像文件名通常遵循MThumb_<用户ID>.jpg(中等尺寸)、LThumb_<用户ID>.jpg(大尺寸)或[用户ID].jpg(原始尺寸)的格式,用CAML过滤这类文件:

var caml = new CamlQuery();
caml.ViewXml = @"<View>
                    <Query>
                        <Where>
                            <Or>
                                <BeginsWith><FieldRef Name='FileLeafRef'/><Value Type='File'>MThumb_</Value></BeginsWith>
                                <BeginsWith><FieldRef Name='FileLeafRef'/><Value Type='File'>LThumb_</Value></BeginsWith>
                            </Or>
                        </Where>
                    </Query>
                </View>";
var avatarItems = userPhotosLib.GetItems(caml);
context.Load(avatarItems, items => items.Include(i => i["FileRef"], i => i["FileLeafRef"]));
context.ExecuteQuery();

四、下载头像到本地服务器

遍历查询到的列表项,用File.OpenBinaryDirect方法将文件下载到目标目录,逻辑和你之前同步普通列表的下载流程一致:

var localSavePath = @"D:\LocalAvatars";
Directory.CreateDirectory(localSavePath);

foreach (var item in avatarItems)
{
    var fileServerRelativeUrl = item["FileRef"].ToString();
    var fileName = item["FileLeafRef"].ToString();
    var localFilePath = Path.Combine(localSavePath, fileName);

    using (var fileStream = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, fileServerRelativeUrl).Stream)
    using (var localFile = File.Create(localFilePath))
    {
        fileStream.CopyTo(localFile);
    }
}

关键提示

  • 确保你的应用账号拥有访问My SiteUser Photos库的权限,一般需要用户配置文件的读取权限
  • 所有List、ListItem的标准操作方法在此场景完全可用,无需修改你已有的核心同步框架

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:25:37