Compartir a través de


Carga de imágenes de perfil de usuario como complemento de SharePoint de ejemplo

El ejemplo Core.ProfilePictureUploader muestra cómo realizar una carga masiva de datos de perfil de usuario desde un recurso compartido de archivos o una dirección URL de SharePoint Online y cómo vincular las propiedades de perfil de usuario a las imágenes cargadas.

Use este ejemplo para aprender a:

  • Migre las imágenes de perfil de un usuario de SharePoint Server local a SharePoint Online.
  • Se han corregido los problemas que se producen cuando la herramienta de sincronización de Azure Active Directory (dirsync) no puede sincronizar las imágenes de perfil de un usuario con SharePoint Online.
  • Reemplace imágenes de perfil de usuario de mala calidad en SharePoint Online.

En este ejemplo se usa una aplicación de consola para hacer lo siguiente:

  • Lea los nombres de usuario y las rutas de acceso de archivo de imagen o las direcciones URL de un archivo de asignación de usuarios.
  • Capturar y cargar una o tres imágenes en una biblioteca de imágenes en el host Mi sitio.
  • Establezca las propiedades del perfil de usuario para vincular las imágenes cargadas al perfil de un usuario.
  • Actualice propiedades de perfil de usuario adicionales (opcionales).

Antes de empezar

Para empezar, descargue el complemento de ejemplo Core.ProfilePictureUploader del proyecto Office 365 Developer Patterns and Practices en GitHub.

Nota:

El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.

Antes de ejecutar este ejemplo de código

  • Almacene las imágenes de usuario que piensa cargar en SharePoint Online en un recurso compartido de archivos o un servidor web.
  • Edite el archivo userlist.csv para incluir lo siguiente:
    • Fila de encabezado que contiene el valor UserPrincipalName, SourceURL.
    • Para cada usuario, agregue una nueva fila que contenga la cuenta organizativa del usuario (o el nombre principal de usuario) y la ruta de acceso del archivo o la dirección URL de la imagen que se va a cargar.

Ejecución de este ejemplo desde Visual Studio

Configure el proyecto Core.ProfilePictureUploader con los siguientes argumentos de línea de comandos: -SPOAdmin Username -SPOAdminPassword Password -Configuration filepath donde:

  • El nombre de usuario es el nombre de usuario del administrador de Office 365.
  • La contraseña es la contraseña del administrador de Office 365.
  • Filepath es la ruta de acceso del archivo configuration.xml.

Establecer los argumentos de la línea de comandos en el proyecto Core.ProfilePictureUploader

  1. En Explorador de soluciones, abra el menú contextual (haga clic con el botón derecho) para las propiedades del proyecto >Core.ProfilePictureUploader.

  2. Elija Depurar.

  3. En Argumentos de línea de comandos, escriba los argumentos de línea de comandos enumerados anteriormente.

Configuración del proceso de carga para cumplir los requisitos

Edite el archivo configuration.xml escribiendo los valores siguientes:

  • Nombre del inquilino de Office 365 en el elemento tenantName. Por ejemplo: <tenantName>contoso.onmicrosoft.com</tenantName>

  • Ruta de acceso del archivo de asignación de usuario en el elemento pictureSourceCsv . Por ejemplo: <pictureSourceCsv>C:\temp\userlist.csv</pictureSourceCsv>

  • Instrucciones de carga de imágenes mediante el elemento thumbs . Edite los siguientes atributos en el elemento thumbs :

    • aupload3Thumbs : establezca en true si desea cargar tres imágenes para cada usuario, o bien establezca en false si solo desea cargar una imagen.

    • createSMLThumbs : se establece en true si desea crear tres imágenes de tamaño diferente (pequeñas, medianas y grandes) de la imagen de origen, o bien establecer en false si desea cargar tres imágenes del mismo tamaño.

  • Propiedades adicionales que se establecerán en el perfil del usuario mediante el elemento additionalProfileProperties . Por ejemplo, el siguiente XML especifica una propiedad de perfil de usuario adicional denominada SPS-PictureExchangeSyncState que debe establecerse en cero en el perfil del usuario cuando se ejecuta el ejemplo de código.

      <additionalProfileProperties>
           <property name="SPS-PictureExchangeSyncState" value="0"/>
      </additionalProfileProperties>
    
  • Ruta de acceso del archivo de registro en el elemento logfile , como se muestra en el ejemplo siguiente. <logFile path="C:\temp\log.txt" enableLogging="true" loggingLevel="verbose" />

  • Retraso de carga en milisegundos entre la carga de diferentes archivos de imagen mediante el elemento uploadDelay . La configuración recomendada para uploadDelay es de 500 milisegundos.

En el archivo App.config, cambie el elemento value de la configuración de ProfilePictureUploader_UPSvc_UserProfileService para incluir una referencia al servicio de perfil de usuario en el Centro de administración de SharePoint Online, como se muestra en el ejemplo siguiente.

<Contoso.Core.ProfilePictureUploader.Properties.Settings>
      <setting name="ProfilePictureUploader_UPSvc_UserProfileService"
            serializeAs="String">
            <value>https://contoso-admin.sharepoint.com/_vti_bin/userprofileservice.asmx</value>
      </setting>
 </Contoso.Core.ProfilePictureUploader.Properties.Settings>

Importante

La conexión al servicio web userprofileservice.asmx en el Centro de administración de SharePoint Online le permite actualizar las propiedades de perfil de usuario de otros usuarios. Al ejecutar este ejemplo de código, use una cuenta de administrador Office 365 que tenga permisos para administrar perfiles de usuario.

Uso del complemento de ejemplo Core.ProfilePictureUploader

Este ejemplo de código se ejecuta como una aplicación de consola. Cuando se ejecuta el ejemplo de código, el método Main de Program.cs hace lo siguiente:

  • Inicializa la aplicación de consola mediante SetupArguments e InitializeConfiguration.

  • Llama a InitializeWebService para conectarse al servicio de perfil de usuario en SharePoint Online.

  • Recorre en iteración el archivo userlist.csv para leer el nombre principal de usuario (UPN) del usuario y la ubicación del archivo de imagen del usuario.

  • Captura la imagen de un usuario mediante los objetos WebRequest y WebResponse en GetImagefromHTTPUrl.

  • Llama a UploadImageToSpo para cargar la imagen del usuario en SharePoint Online.

  • Llama a SetMultipleProfileProperties para establecer las propiedades de perfil de usuario PictureURL y SPS-PicturePlaceholderState para el usuario.

  • Llama a SetAdditionalProfileProperties para establecer propiedades adicionales en el perfil de usuario después de cargar el archivo de imagen.

static void Main(string[] args)
        {
            int count = 0;

            if (SetupArguments(args)) // Checks if args passed are valid 
            {

                if (InitializeConfiguration()) // Check that the configuration file is valid
                {
                    if (InitializeWebService()) // Initialize the web service end point for the SharePoint Online user profile service.
                    {
                        
                        using (StreamReader readFile = new StreamReader(_appConfig.PictureSourceCsv))
                        {
                            string line;
                            string[] row;
                            string sPoUserProfileName;
                            string sourcePictureUrl;

                            while ((line = readFile.ReadLine()) != null)
                            {
                                if (count > 0)
                                {
                                    row = line.Split(',');
                                    sPoUserProfileName = row[0]; 
                                    sourcePictureUrl = row[1]; 

                                    LogMessage("Begin processing for user " + sPoUserProfileName, LogLevel.Warning);

                                    // Get source picture from source image path.
                                    using (MemoryStream picturefromExchange = GetImagefromHTTPUrl(sourcePictureUrl))
                                    {
                                        if (picturefromExchange != null) // If we got image, upload to SharePoint Online
                                        {
                                            // Create SharePoint naming convention for image file.
                                            string newImageNamePrefix = sPoUserProfileName.Replace("@", "_").Replace(".", "_");
                                            // Upload source image to SharePoint Online.
                                            string spoImageUrl = UploadImageToSpo(newImageNamePrefix, picturefromExchange);
                                            if (spoImageUrl.Length > 0)// If upload worked:
                                            {
                                                string[] profilePropertyNamesToSet = new string[] { "PictureURL", "SPS-PicturePlaceholderState" };
                                                string[] profilePropertyValuesToSet = new string[] { spoImageUrl, "0" };
                                                // Set these two required user profile properties - path to uploaded image, and pictureplaceholder state.
                                                SetMultipleProfileProperties(_sPOProfilePrefix + sPoUserProfileName, profilePropertyNamesToSet, profilePropertyValuesToSet);
                                                // Set additional user profile properties based on your requirements.
                                                SetAdditionalProfileProperties(_sPOProfilePrefix + sPoUserProfileName);
                                            }
                                        }
                                    }

                                    LogMessage("End processing for user " + sPoUserProfileName, LogLevel.Warning);

                                    int sleepTime = _appConfig.UploadDelay;
                                    System.Threading.Thread.Sleep(sleepTime); // A pause between uploads is recommended. 
                                }
                                count++;
                            }
                        }
                    }
                }
            }


            LogMessage("Processing finished for " + count + " user profiles", LogLevel.Information);
         } 


InitializeWebService se conecta a SharePoint Online y establece una referencia del servicio de perfil de usuario en una variable de instancia. Otros métodos de este ejemplo de código usan esta variable de instancia para aplicar actualizaciones a las propiedades de perfil de usuario. Para administrar el perfil de usuario, este ejemplo de código usa el servicio web userprofileservice.asmx en el Centro de administración de SharePoint Online.

static bool InitializeWebService()
        {
            try
            {
                string webServiceExt = "_vti_bin/userprofileservice.asmx";
                string adminWebServiceUrl = string.Empty;

                // Append the web service (ASMX) URL onto the admin website URL.
                if (_profileSiteUrl.EndsWith("/"))
                    adminWebServiceUrl = _profileSiteUrl + webServiceExt;
                else
                    adminWebServiceUrl = _profileSiteUrl + "/" + webServiceExt;

                LogMessage("Initializing SPO web service " + adminWebServiceUrl, LogLevel.Information);

                // Get secure password from clear text password.
                SecureString securePassword = GetSecurePassword(_sPoAuthPasword);

                // Set credentials from SharePoint Client API, used later to extract authentication cookie, so can replay to web services.
                SharePointOnlineCredentials onlineCred = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);

                // Get the authentication cookie by passing the URL of the admin website. 
                string authCookie = onlineCred.GetAuthenticationCookie(new Uri(_profileSiteUrl));

                // Create a CookieContainer to authenticate against the web service. 
                CookieContainer authContainer = new CookieContainer();

                // Put the authenticationCookie string in the container. 
                authContainer.SetCookies(new Uri(_profileSiteUrl), authCookie);

                // Set up the user profile web service. 
                _userProfileService = new UPSvc.UserProfileService();

                // Assign the correct URL to the admin profile web service. 
                _userProfileService.Url = adminWebServiceUrl;

                // Assign previously created authentication container to admin profile web service. 
                _userProfileService.CookieContainer = authContainer;
               // LogMessage("Finished creating service object for SharePoint Online Web Service " + adminWebServiceUrl, LogLevel.Information);
                return true;
            }
            catch (Exception ex)
            {
                LogMessage("Error initiating connection to profile web service in SPO " + ex.Message, LogLevel.Error);
                return false;

            }

            
        }


El método Main de Program.cs llama a UploadImageToSpo para cargar la imagen de perfil del usuario en SharePoint Online. Todas las imágenes de perfil de los usuarios se almacenan en una biblioteca de imágenes en el host de Mi sitio. UploadImageToSpo realiza las siguientes tareas:

  • Se conecta a SharePoint Online.
  • Determina el número de imágenes que se van a cargar para cada usuario.
    • Si configuró la aplicación para cargar una imagen por usuario, la imagen se carga en la biblioteca de imágenes.
    • Si configuró la aplicación para cargar tres imágenes por usuario, la aplicación comprueba el valor de createSMLThumbs en el archivo de configuración para determinar si se requieren tres imágenes de tamaño diferente. Si se requieren tres imágenes de tamaño diferente, la aplicación usa ResizeImageSmall y ResizeImageLarge para crear tres imágenes de tamaño diferente a partir de la imagen de origen. A continuación, la aplicación carga las imágenes cambiadas de tamaño en la biblioteca de imágenes. Si no se requieren tres imágenes de tamaño diferente, la aplicación carga tres imágenes del mismo tamaño en la biblioteca de imágenes.
static string UploadImageToSpo(string PictureName, Stream ProfilePicture)
        {
            try
            {

                string spPhotoPathTempate = "/User Photos/Profile Pictures/{0}_{1}Thumb.jpg"; // Path template to picture library on the My Site host.
                string spImageUrl = string.Empty;

                // Create SharePoint Online Client context to My Site host.
                ClientContext mySiteclientContext = new ClientContext(_mySiteUrl);
                SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
                // Provide authentication credentials using Office 365 authentication.
                mySiteclientContext.Credentials = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);
                                
                if (!_appConfig.Thumbs.Upload3Thumbs) // Upload a single input image only to picture library, no resizing necessary.
                {
                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
                    LogMessage("Uploading single image, no resize, to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
                }
                else if (_appConfig.Thumbs.Upload3Thumbs &amp;&amp; !_appConfig.Thumbs.CreateSMLThumbs)// Upload three images of the same size. 
                {
                    // The following code is not optimal. Upload the same source image three times with different names.
                    // No resizing of images necessary.
                    LogMessage("Uploading threes image to SPO, no resize", LogLevel.Information);

                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
                    LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);

                    ProfilePicture.Seek(0, SeekOrigin.Begin);
                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
                    LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
                    
                    ProfilePicture.Seek(0, SeekOrigin.Begin);
                    spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
                    LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
                    Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);

                    
                }
                else if (_appConfig.Thumbs.Upload3Thumbs &amp;&amp; _appConfig.Thumbs.CreateSMLThumbs) //Generate 3 different sized images.
                {
                    LogMessage("Uploading threes image to SPO, with resizing", LogLevel.Information);
                    // Create three images based on recommended sizes for SharePoint Online.
                    // Create small-sized image.
                    using (Stream smallThumb = ResizeImageSmall(ProfilePicture, _smallThumbWidth))
                    {
                        if (smallThumb != null)
                        {
                            spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
                            LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, smallThumb, true);                            
                        }
                    }

                    // Create medium-sized image.
                    using (Stream mediumThumb = ResizeImageSmall(ProfilePicture, _mediumThumbWidth))
                    {
                        if (mediumThumb != null)
                        {
                            spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
                            LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, mediumThumb, true);
                           
                        }
                    }

                    // Create large-sized image. This image is shown when you open the user's OneDrive for Business. 
                    using (Stream largeThumb = ResizeImageLarge(ProfilePicture, _largeThumbWidth))
                    {
                        if (largeThumb != null)
                        {

                            spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
                            LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, largeThumb, true);
                            
                        }
                    }
                  
                   
                }
                // Return URL of the medium-sized image to set properties on the user profile.
                return _mySiteUrl + string.Format(spPhotoPathTempate, PictureName, "M");                
                
            }
            catch (Exception ex)
            {
                LogMessage("User Error: Failed to upload thumbnail picture to SPO for " + PictureName + " " + ex.Message, LogLevel.Error);
                return string.Empty;
            }

        }


SetMultipleProfileProperties establece varias propiedades de perfil de usuario en una sola llamada de método. En este ejemplo de código, SetMultipleProfileProperties establece las siguientes propiedades de perfil de usuario para un usuario:

  • PictureURL : se establece en la dirección URL de la imagen cargada de tamaño medio en la biblioteca de imágenes del host Mi sitio.

  • SPS-PicturePlaceholderState : se establece en cero para indicar que SharePoint Online debe mostrar la imagen cargada para el usuario.

static void SetMultipleProfileProperties(string UserName, string[] PropertyName, string[] PropertyValue)
        {

            LogMessage("Setting multiple SPO user profile properties for " + UserName, LogLevel.Information);

            try
            {
                int arrayCount = PropertyName.Count();

                UPSvc.PropertyData[] data = new UPSvc.PropertyData[arrayCount];
                for (int x = 0; x < arrayCount; x++)
                {
                    data[x] = new UPSvc.PropertyData();
                    data[x].Name = PropertyName[x];
                    data[x].IsValueChanged = true;
                    data[x].Values = new UPSvc.ValueData[1];
                    data[x].Values[0] = new UPSvc.ValueData();
                    data[x].Values[0].Value = PropertyValue[x];
                }

                _userProfileService.ModifyUserPropertyByAccountName(UserName, data);
                // LogMessage("Finished setting multiple SharePoint Online user profile properties for " + UserName, LogLevel.Information);

            }
            catch (Exception ex)
            {
                LogMessage("User Error: Exception trying to update profile properties for user " + UserName + "\n" + ex.Message, LogLevel.Error);
            }
        }


SetAdditionalProfileProperties establece las propiedades de perfil de usuario adicionales que quiera actualizar después de cargar los archivos de imagen. Puede especificar propiedades adicionales para actualizar en el archivo configuration.xml.

static void SetAdditionalProfileProperties(string UserName)
        {
            if (_appConfig.AdditionalProfileProperties.Properties == null) // If there are no additional properties to update. 
                return;

            int propsCount = _appConfig.AdditionalProfileProperties.Properties.Count();
            if (propsCount > 0)
            {
                string[] profilePropertyNamesToSet = new string[propsCount];
                string[] profilePropertyValuesToSet = new string[propsCount];
                // Loop through each property in configuration file.
                for (int i = 0; i < propsCount; i++)
                {
                    profilePropertyNamesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Name;
                    profilePropertyValuesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Value;
                }

                // Set all properties in a single call.
                SetMultipleProfileProperties(UserName, profilePropertyNamesToSet, profilePropertyValuesToSet);

            }
        }

Vea también