用代码实现Sharepoint2010的个人信息的照片上传(原创)
2012-08-23 17:13
381 查看
前言
Sharepoint2010的用户同步无法从AD中完全同步所有用户的照片信息到sharepoint2010的中来,经过查询微软资料需要打累计补丁您尝试导入从ActiveDirectorythumbnailPhoto属性到MicrosoftSharePoint服务器2010年的PictureURL属性在用户配置文件中的图片。设置导入PictureURL映射。然后,在SharePoint服务器执行完全同步。在这种情况下,图片不会添加到SharePoint服务器中的用户配置文件。
我在测试服务器上打了累计补丁,然后完全同步还是无法做到,再说累计补丁是微软没有经过测试的补丁,不敢在正式生产环境中打此类补丁。因此,需要考虑其他办法从AD或其他文件中同步用户的照片信息到sharepoint2010中来。
实现方法
实现思路
以管理员账号打开个人站点进入后找到【图片库】-【用户照片】如下图:
点击进入后可以看到MOSS个人站点下每个人的照片信息如下图:
可以看到每个用户都有3张照片,每张照片大小规格以及命名规则如下表格:
分为大中小三种图片,格式为JPG格式
明白这个后,其实我们就可以写代码操作图片库了,并把图片保存成3种大小规格,命名规则合符规定,最后更新UserProfile中的PictureUrl属性即可完成照片的上传。
实现方法
首先需要引用如下主要DLL,如下图:Microsoft.Office.Server.dll
Microsoft.Office.Server.UserProfiles.dll
Microsoft.SharePoint.dll
microsoft.sharepoint.portal.dll
System.Drawing.dll
引用的命名空间如下:
usingMicrosoft.SharePoint; usingMicrosoft.SharePoint.WebControls; usingSystem.IO; usingSystem.Drawing; usingMicrosoft.Office.Server.UserProfiles; usingMicrosoft.SharePoint.Portal.WebControls;
代码段:
[code]usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Drawing;
usingSystem.Reflection;
usingMicrosoft.SharePoint;
usingMicrosoft.SharePoint.WebControls;
usingSystem.IO;
usingMicrosoft.Office.Server.UserProfiles;
usingMicrosoft.SharePoint.Portal.WebControls;
usingSystem.Web;
usingSystem.Threading;
usingSystem.Globalization;
usingSystem.Data;
usingSystem.Collections;
namespaceUploadProfileImage
{
classProgram
{
privatestaticDataTableuserTable=null;
enumProfileType{None,NoPhoto,Inactive};
privatestaticProfileTypeusersLoaded=ProfileType.None;
privatestaticProfileImagePickerprofileImagePicker=newProfileImagePicker();
privatestaticstringMySiteHostUrl="http://win-moss/my/";
privatestaticstringMAccountName="contoso\\test02";
staticvoidMain(string[]args)
{
UploadPhotos();
Console.WriteLine("ok");
Console.Read();
}
privatestaticDataTableGetNoPhotoProfiles()
{
DataTabledt=CreateUserTable();
SPSitesite=newSPSite(MySiteHostUrl);
SPWebweb=site.OpenWeb();
SPServiceContextsc=SPServiceContext.GetContext(site);
UserProfileManagerupm=newUserProfileManager(sc);
IEnumeratorprofileEnumerator=upm.GetEnumerator();
InitializeProfileImagePicker(web);
while(profileEnumerator.MoveNext())
{
try
{
UserProfileup=(UserProfile)profileEnumerator.Current;
if(up["PictureUrl"].Value==null||up["PictureUrl"].Value.ToString()=="")
{
DataRowdr=dt.NewRow();
dr["username"]=up["AccountName"];
dr["last"]=up["LastName"];
dr["first"]=up["FirstName"];
dr["UserProfileID"]=up.ID;
dt.Rows.Add(dr);
dt.AcceptChanges();
}
}
catch(Exception)
{
}
}
web.Dispose();
site.Dispose();
returndt;
}
privatestaticDataTableCreateUserTable()
{
DataTabledt=newDataTable();
DataColumndcUsr=newDataColumn("username");
DataColumndcLast=newDataColumn("last");
DataColumndcFirst=newDataColumn("first");
DataColumndcProfileId=newDataColumn("UserProfileID");
DataColumndcPair=newDataColumn("FoundPhoto");
DataColumndcPairPath=newDataColumn("FoundPhotoURL");
dt.Columns.Add(dcUsr);
dt.Columns.Add(dcLast);
dt.Columns.Add(dcFirst);
dt.Columns.Add(dcProfileId);
dt.Columns.Add(dcPair);
dt.Columns.Add(dcPairPath);
returndt;
}
///<summary>
///
///</summary>
///<paramname="fileName"></param>
///<returns></returns>
privatestaticbyte[]ReadFile(stringfileName)
{
FileStreampFileStream=null;
byte[]pReadByte=newbyte[0];
try
{
pFileStream=newFileStream(fileName,FileMode.Open,FileAccess.Read);
BinaryReaderr=newBinaryReader(pFileStream);
r.BaseStream.Seek(0,SeekOrigin.Begin);//将文件指针设置到文件开
pReadByte=r.ReadBytes((int)r.BaseStream.Length);
returnpReadByte;
}
catch
{
returnpReadByte;
}
finally
{
if(pFileStream!=null)
pFileStream.Close();
}
}
///<summary>
///上传图片
///</summary>
privatestaticvoidUploadPhotos()
{
SPSitemySites=newSPSite(MySiteHostUrl);
SPWebmyWeb=mySites.OpenWeb();
SPFoldersubfolderForPictures=myWeb.GetFolder("UserPhotos\\ProfilePictures");
if(subfolderForPictures==null)
{
return;
}
UserProfileManageruserProfileManager=newUserProfileManager(SPServiceContext.GetContext(mySites));
//读取文档
string[]strCollection=Directory.GetFiles(@"c:\photoFolder");
foreach(stringiteminstrCollection)
{
//FileInfo
FileInfofileinfo=newFileInfo(item);
//
byte[]buffer=null;
stringfileNameWithoutExtension=GetFileNameFromAccountName(MAccountName);
stringphotoURL=fileinfo.FullName;
if(photoURL.ToLower().EndsWith("jpg"))
{
System.Threading.Thread.Sleep(2500);
buffer=ReadFile(fileinfo.FullName);
intlargeThumbnailSize=0X90;
intmediumThumbnailSize=0X60;
intsmallThumbnailSize=0X20;
using(MemoryStreamstream=newMemoryStream(buffer))
{
using(Bitmapbitmap=newBitmap(stream,true))
{
CreateThumbnail(bitmap,largeThumbnailSize,largeThumbnailSize,subfolderForPictures,fileNameWithoutExtension+"_LThumb.jpg");
CreateThumbnail(bitmap,mediumThumbnailSize,mediumThumbnailSize,subfolderForPictures,fileNameWithoutExtension+"_MThumb.jpg");
CreateThumbnail(bitmap,smallThumbnailSize,smallThumbnailSize,subfolderForPictures,fileNameWithoutExtension+"_SThumb.jpg");
}
}
SetPictureUrl(MAccountName,subfolderForPictures,userProfileManager,mySites.Url);
}
}
myWeb.Dispose();
mySites.Dispose();
}
///<summary>
///根据账号得到文件名称
///</summary>
///<paramname="accountName"></param>
///<returns></returns>
privatestaticstringGetFileNameFromAccountName(stringaccountName)
{
stringresult=accountName;
stringcharsToReplace=@"\/:*?""<>|";
Array.ForEach(charsToReplace.ToCharArray(),charToReplace=>result=result.Replace(charToReplace,'_'));
returnresult;
}
privatestaticvoidInitializeProfileImagePicker(SPWebweb)
{
TypeprofileImagePickerType=typeof(ProfileImagePicker);
FieldInfofi_m_objWeb=profileImagePickerType.GetField("m_objWeb",BindingFlags.NonPublic|BindingFlags.Instance);
fi_m_objWeb.SetValue(profileImagePicker,web);
MethodInfomi_LoadPictureLibraryInternal=profileImagePickerType.GetMethod("LoadPictureLibraryInternal",BindingFlags.NonPublic|BindingFlags.Instance);
if(mi_LoadPictureLibraryInternal!=null)
{
mi_LoadPictureLibraryInternal.Invoke(profileImagePicker,newobject[]{});
}
}
///<summary>
///
///</summary>
///<paramname="original"></param>
///<paramname="idealWidth"></param>
///<paramname="idealHeight"></param>
///<paramname="folder"></param>
///<paramname="fileName"></param>
///<returns></returns>
privatestaticSPFileCreateThumbnail(Bitmaporiginal,intidealWidth,intidealHeight,SPFolderfolder,stringfileName)
{
SPFilefile=null;
//WorkaroundtogettheMicrosoft.Office.Server.UserProfilesassembly
AssemblyuserProfilesAssembly=typeof(UserProfile).Assembly;
//UserProfilePhotosisinternal
//sothereisnovisibilityfromVisualStudio
TypeuserProfilePhotosType=userProfilesAssembly.GetType("Microsoft.Office.Server.UserProfiles.UserProfilePhotos");
MethodInfomi_CreateThumbnail=userProfilePhotosType.GetMethod("CreateThumbnail",BindingFlags.NonPublic|BindingFlags.Static);
if(mi_CreateThumbnail!=null)
{
file=(SPFile)mi_CreateThumbnail.Invoke(null,newobject[]{original,idealWidth,idealHeight,folder,fileName});
}
returnfile;
}
privatestaticvoidSetPictureUrl(stringaccountName,SPFoldersubfolderForPictures,UserProfileManageruserProfileManager,stringsiteUrl)
{
UserProfileuserProfile=userProfileManager.GetUserProfile(accountName);
stringfileNameWithoutExtension=GetFileNameFromAccountName(accountName);
stringpictureUrl=String.Format("{0}/{1}/{2}_MThumb.jpg",siteUrl,subfolderForPictures.Url,fileNameWithoutExtension);
userProfile["PictureUrl"].Value=pictureUrl;
userProfile.Commit();
}
}
}
测试结果:
在AD新建一个用户contoso\\test02,默认没有照片如下图:
在我的虚拟机C盘下建立一个文件夹(C:\photoFolder)并放上照片文件(Hydrangeas.jpg)如下图:
去【图片库】-【用户照片】也看不到test02的照片信息,如下图:
运行代码后:
去个人站点下的用户配置信息看照片如下图:
去【图片库】-【用户照片】可以看到如下图信息:
[/code]
相关文章推荐
- 用代码实现Sharepoint2010的个人信息的照片上传(2)(原创)
- 用代码实现Sharepoint2010的个人信息的照片上传(3)—gif,png格式同步
- flex利用webservice上传照片实现代码
- H5移动端实现仿QQ空间照片上传效果代码
- java读取图片处理实现缩放裁剪,用于个人信息中上传图片自定义头像大小
- 【最新原创】中国移动(中国联通)_通信账单,详单,个人信息抓取爬虫代码
- 【原创】用JAVA实现大文件上传及显示进度信息
- Andriod app开发中身份信息验证模块,利用appcan实现照片的上传
- java实现上传excel,并提取信息然后插入数据库(实际项目代码)
- webuploader+springmvc实现多文件上传(html+js+css原创,后台代码借鉴)
- 【个人学习之路】PHP和MySQL实现上传图书信息
- webuploader+springmvc实现多文件上传(html+js+css原创,后台代码借鉴)
- 一行代码实现安卓照片选取上传服务器,并适配安卓7.0无法调起相机的问题
- 【原创】Ext 上传文件,前后台实现, Asp.net 代码
- 上传照片代码记录(1) ——实现周围透明灰色,中间可以操作的对话框效果
- Android捕获全局异常信息并实现上传
- Nginx 代理转发阿里云OSS上传的实现代码
- 『原创』再谈用 php 实现域名 whois 信息查询
- Android捕获全局异常信息并实现上传
- 集成开源系统实现自动化构建、代码质量评估、项目信息统计