您的位置:首页 > 编程语言

用代码实现Sharepoint2010的个人信息的照片上传(原创)

2012-08-23 17:13 381 查看

前言

Sharepoint2010的用户同步无法从AD中完全同步所有用户的照片信息到sharepoint2010的中来,经过查询微软资料需要打累计补丁http://support.microsoft.com/kb/2394320/zh-cn,累计补丁描述如下:

您尝试导入从ActiveDirectorythumbnailPhoto属性到MicrosoftSharePoint服务器2010年的PictureURL属性在用户配置文件中的图片。设置导入PictureURL映射。然后,在SharePoint服务器执行完全同步。在这种情况下,图片不会添加到SharePoint服务器中的用户配置文件。

我在测试服务器上打了累计补丁,然后完全同步还是无法做到,再说累计补丁是微软没有经过测试的补丁,不敢在正式生产环境中打此类补丁。因此,需要考虑其他办法从AD或其他文件中同步用户的照片信息到sharepoint2010中来。

实现方法

实现思路

以管理员账号打开个人站点http://win-moss/my/,点【网站操作】-【查看所有网站内容】,如下图:





进入后找到【图片库】-【用户照片】如下图:





点击进入后可以看到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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: