Hi,
We recently had a requirement to create a web part that would be used to update user profile picture and few other properties.

For this we used the FIileUpload control.
The code used
public void UploadPhoto(string accountName, byte[] image)
{
string loginNameForProfile = accountName.Substring(accountName.IndexOf(@"|") + 1);
if (profileUpload.HasFile)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(SPContext.Current.Site.Url))
{
SPServiceContext serviceContext = SPServiceContext.GetContext(site);
UserProfileManager userProfileMgr = new UserProfileManager(serviceContext);
ProfilePropertyManager profilePropMgr =
new UserProfileConfigManager(serviceContext).ProfilePropertyManager;
// Retrieve all properties for the "UserProfile" profile subtype,
// and retrieve the property values for a specific user.
ProfileSubtypePropertyManager subtypePropMgr =
profilePropMgr.GetProfileSubtypeProperties("UserProfile");
UserProfile userProfile = userProfileMgr.GetUserProfile(loginNameForProfile);
SPSite mySite = new SPSite(userProfileMgr.MySiteHostUrl);
SPWeb web = mySite.RootWeb;
SPFolder subfolderForPictures = web.Folders["User Photos"].SubFolders["Profile Pictures"];
web.AllowUnsafeUpdates = true;
Stream fs = profileUpload.PostedFile.InputStream;
byte[] buffer = new byte[profileUpload.PostedFile.ContentLength];
fs.Read(buffer, 0, Convert.ToInt32(profileUpload.PostedFile.ContentLength));
fs.Close();
int largeThumbnailSize = 300;
int mediumThumbnailSize = 72;
int smallThumbnailSize = 48;
string accName = accountName.Substring(accountName.IndexOf(@"\") + 1);
using (MemoryStream stream = new MemoryStream(buffer))
{
using (Bitmap bitmap = new Bitmap(stream, true))
{
CreateThumbnail(bitmap, largeThumbnailSize, largeThumbnailSize, subfolderForPictures,
accName + "_LThumb.jpg");
CreateThumbnail(bitmap, mediumThumbnailSize, mediumThumbnailSize, subfolderForPictures,
accName + "_MThumb.jpg");
CreateThumbnail(bitmap, smallThumbnailSize, smallThumbnailSize, subfolderForPictures,
accName + "_SThumb.jpg");
}
}
string pictureUrl = String.Format("{0}/{1}/{2}_MThumb.jpg", subfolderForPictures.ParentWeb.Site.Url, subfolderForPictures.Url, accName);
// Change the value of a single-value user property.
userProfile[PropertyConstants.PictureUrl].Value = pictureUrl;
imgUserProfile.ImageUrl = pictureUrl;
// Save the changes to the server.
userProfile.Commit();
web.AllowUnsafeUpdates = false;
}
});
}
}
public SPFile CreateThumbnail(Bitmap original, int idealWidth, int idealHeight, SPFolder folder, string fileName)
{
SPFile file = null;
Assembly userProfilesAssembly = typeof(UserProfile).Assembly;
Type userProfilePhotosType = userProfilesAssembly.GetType("Microsoft.Office.Server.UserProfiles.UserProfilePhotos");
MethodInfo[] mi_methods = userProfilePhotosType.GetMethods(BindingFlags.NonPublic | BindingFlags.Static);
MethodInfo mi_CreateThumbnail = mi_methods[0];
if (mi_CreateThumbnail != null)
{
file = (SPFile)mi_CreateThumbnail.Invoke(null, new object[] { original, idealWidth, idealHeight, folder, fileName, null });
}
return file;
} // end of function
The helpful post
http://lixuan0125.wordpress.com/2013/04/08/upload-user-profile-pictures-programmatically-sharepoint-2013/
Hope it helps
0.000000
0.000000