如何用C#同步SharePoint Online MySite用户头像至本地文件服务器?
一、连接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 Site
User Photos库的权限,一般需要用户配置文件的读取权限 - 所有
List、ListItem的标准操作方法在此场景完全可用,无需修改你已有的核心同步框架
内容的提问来源于stack exchange,提问作者TomS
相关产品推荐
相关产品推荐

