User Profile Service application maintains all the Information about the User
available in SharePoint as User Profiles. These Information will be synchronized with the
external source such as Active Directory or Custom DB by User Profile
Synchronization Service running in the SharePoint server. User Profile Photo is
one of the property in User Profile called “PictureUrl”. All the User Profile
Photos are maintained in SharePoint library in My Site called “User Photos”, for
each User Profile 3 files are maintained with various dimensions (Large,Medium
and Small size) in the library.
When a User uploads a profile picture in SharePoint, these
three files will be created from the chosen file and uploaded to the Profile
Pictures folder in “User Photos” library under My site and the reference to the
Image will be updated to the “PictureUrl” property in the User Profile.
If we are giving an option to change the Profile picture in
out custom component, we also need to create these 3 different files and update
the reference in User Profile property. Below code snippet will do the need.
#region Profile Image Updation ////// Updates the current User profile Image /// /// /// protected void btnProfileUpload_Click(object sender, EventArgs e) { try { //Uncomment if Change profile photo functionality is required if (Page.IsValid && ctrlUpload.HasFile) { UploadPhoto(SPContext.Current.Web.CurrentUser.LoginName, ctrlUpload.FileBytes); } } catch (Exception ex) { ErrorHandling.WriteLog("btnProfileUpload_Click " + ex.Message, ex, SPContext.Current.Web); } } public void UploadPhoto(string accountName, byte[] image) { SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(webURL)) { using (SPWeb web = site.OpenWeb()) { web.AllowUnsafeUpdates = true; ProfileImagePicker profileImagePicker = new ProfileImagePicker(); InitializeProfileImagePicker(profileImagePicker, web); SPFolder subfolderForPictures = GetSubfolderForPictures(profileImagePicker); string fileNameWithoutExtension = GetFileNameFromAccountName(accountName); int largeThumbnailSize = 120; int mediumThumbnailSize = 90; int smallThumbnailSize = 30; using (MemoryStream stream = new MemoryStream(image)) { using (Bitmap bitmap = new Bitmap(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(accountName, subfolderForPictures, fileNameWithoutExtension); web.AllowUnsafeUpdates = false; } } }); } public void SetPictureUrl(string accountName, SPFolder subfolderForPictures, string fileNameWithoutExtension) { SPSite site = subfolderForPictures.ParentWeb.Site; UserProfileManager userProfileManager = new UserProfileManager(SPServiceContext.GetContext(site)); UserProfile userProfile = userProfileManager.GetUserProfile(accountName); string pictureUrl = String.Format("{0}/{1}/{2}_MThumb.jpg", site.Url, subfolderForPictures.Url, fileNameWithoutExtension); userProfile["PictureUrl"].Value = pictureUrl; userProfile.Commit(); } public string GetFileNameFromAccountName(string accountName) { string result = accountName; string charsToReplace = @"\/:*?""<>|"; Array.ForEach(charsToReplace.ToCharArray(), charToReplace => result = result.Replace(charToReplace, '_')); return result; } public void InitializeProfileImagePicker(ProfileImagePicker profileImagePicker, SPWeb web) { Type profileImagePickerType = typeof(ProfileImagePicker); FieldInfo fieldInfo = profileImagePickerType.GetField("m_objWeb", BindingFlags.NonPublic | BindingFlags.Instance); fieldInfo.SetValue(profileImagePicker, web); MethodInfo miLoadPictureLibraryInternal = profileImagePickerType.GetMethod("LoadPictureLibraryInternal", BindingFlags.NonPublic | BindingFlags.Instance); if (miLoadPictureLibraryInternal != null) { miLoadPictureLibraryInternal.Invoke(profileImagePicker, new object[] { }); } } public SPFile CreateThumbnail(Bitmap original, int idealWidth, int idealHeight, SPFolder folder, string fileName) { SPFile file = null; Assembly userProfilesAssembly = Assembly.Load("Microsoft.Office.Server.UserProfiles, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"); Type userProfilePhotosType = userProfilesAssembly.GetType("Microsoft.Office.Server.UserProfiles.UserProfilePhotos"); MethodInfo miCreateThumbnail = userProfilePhotosType.GetMethod("CreateThumbnail", BindingFlags.NonPublic | BindingFlags.Static); if (miCreateThumbnail != null) { file = (SPFile)miCreateThumbnail.Invoke(null, new object[] { original, idealWidth, idealHeight, folder, fileName }); } return file; } public SPFolder GetSubfolderForPictures(ProfileImagePicker profileImagePicker) { SPFolder folder = null; Type profileImagePickerType = typeof(ProfileImagePicker); MethodInfo miGetSubfolderForPictures = profileImagePickerType.GetMethod("GetSubfolderForPictures", BindingFlags.NonPublic | BindingFlags.Instance); if (miGetSubfolderForPictures != null) { folder = (SPFolder)miGetSubfolderForPictures.Invoke(profileImagePicker, new object[] {true }); } return folder; } #endregion