Compartir a través de


Uso de datos de columna de imagen en Microsoft Dataverse

Puede almacenar datos de imagen en Microsoft Dataverse mediante columnas de imagen o columnas de archivo. Las columnas de imagen de Dataverse tienen comportamientos y limitaciones especiales diseñados para admitir la visualización de imágenes dentro de las aplicaciones, y puede usar muchas de las mismas API para las columnas de archivo con columnas de imagen.

La siguiente tabla presenta algunas de las diferencias entre las columnas de imagen y archivo.

Imagen Archivo
Tamaño de archivo Limitado a 30 MB. Hasta 10 GB. Si bien la API puede manejar archivos de hasta 10 GB de tamaño, los controles de cliente de Power Apps actualmente solo admiten archivos de hasta 128 MB. Si se excede el valor de 128 MB al usar estos controles, se producirán errores al cargar o descargar archivos.
Tipos de archivos Solo tipos de archivo de imagen Todos los tipos de archivos permitidos por el valor de Organization.BlockedAttachments. Más información: Bloquear ciertos tipos de archivos
Configurar con actualización Puede configurar los datos de la columna de imagen con otros datos de registro mediante la actualización. Solo puede cargar archivos individualmente en las propiedades de la columna de archivo.
Eliminar con actualización Puede eliminar los datos de la columna de imágenes configurando el atributo o la propiedad en null y luego actualice el registro. Más información: Eliminar imágenes Solo puede eliminar los datos de la columna del archivo usando el mensaje DeleteFile o enviando una solicitud DELETE a la columna específica usando la API web. Más información: Eliminar archivos
Configurar con Crear Cuando la columna de la imagen es la imagen principal, puede configurar los datos de la imagen con otros datos de registro usando crear. Más información: Imágenes primarias Solo puede cargar archivos individualmente en las propiedades de la columna de archivo después de crearse el registro.
Regresar con Recuperar Puede recuperar imágenes del tamaño de una miniatura con otros datos de registro usando recuperar. El valor devuelto es el id. de archivo. Más información: Comportamiento en la recuperación
URL de descarga Cada columna de imagen tiene una columna de cadena que contiene una URL relativa que puede incluir en una aplicación que permite descargar el archivo de imagen. Más información: URL de descarga No hay una columna de cadena con una URL de descarga, pero puede redactar una URL para descargar el archivo directamente desde la API web. Más información: Descargar un archivo en una sola solicitud usando la API web

Tamaño máximo de imagen

Al igual que las columnas de archivo, puede especificar el tamaño máximo de los datos almacenados en una columna de imagen mediante la MaxSizeInKb propiedad . Sin embargo, el tamaño máximo permitido es de 30 MB.

Si intenta cargar un archivo demasiado grande, recibirá el siguiente mensaje de error:

Nombre: ProcessImageFailure
Código: 0x80072553
Número: -2147015341
Mensaje: Error occured when processing image. Reason: File size is too big. MaxSize: 0 MB, Uploaded filesize: 0 MB.

Para comprobar el tamaño máximo de archivo, use los ejemplos siguientes:

El siguiente método GetImageColumnMaxSizeInKb devuelve el valor MaxSizeInKB para una columna ImageAttributeMetadata.

/// <summary>
/// Retrieves the MaxSizeInKb property of an image column.
/// </summary>
/// <param name="service">IOrganizationService</param>
/// <param name="entityLogicalName">The logical name of the table that has the column</param>
/// <param name="imageColumnLogicalName">The logical name of the image column.</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static int GetImageColumnMaxSizeInKb(
   IOrganizationService service, 
   string entityLogicalName, 
   string imageColumnLogicalName) 
{

   RetrieveAttributeRequest retrieveAttributeRequest = new() { 
         EntityLogicalName = entityLogicalName,
         LogicalName = imageColumnLogicalName
   };

   RetrieveAttributeResponse retrieveAttributeResponse;
   try
   {
         retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest);
   }
   catch (Exception)
   {
         throw;
   }

   if (retrieveAttributeResponse.AttributeMetadata is ImageAttributeMetadata imageColumn)
   {
         return imageColumn.MaxSizeInKB.Value;
   }
   else
   {
         throw new Exception($"{entityLogicalName}.{imageColumnLogicalName} is not a image column.");
   }
}

Más información:

Tipos de archivo de imagen

Las columnas de imágenes almacenan los siguientes tipos de imágenes binarias:

Formato de archivo Tipo de MIME Extensiones de archivo
Formato de intercambio de gráficos GIF image/gif .gif
Imagen del Grupo Conjunto de Expertos en Fotografía image/jpeg .jpg, .jpeg
Archivo de mapa de bits image/bmp .bmp
Gráficos de red portátiles image/png .png

Si intenta guardar un archivo que no es uno de estos tipos, recibirá el siguiente mensaje de error:

Nombre: ProcessImageFailure
Código: 0x80072553
Número: -2147015341
Mensaje: Error occured when processing image. Reason: Update image properties failed for objectid: <id of record>, logicalName: <logical name of table>, attribute: <logical name of image column

Imágenes en tamaño completo y en miniatura

Al establecer un valor de columna de imagen, Dataverse genera automáticamente una imagen de tamaño de miniatura que es adecuada para su uso como icono en una aplicación.

Si configura la columna de imagen para almacenar una imagen completa, puede guardar y descargar un archivo de hasta el tamaño configurado en MaxSizeInKb por separado de la imagen en miniatura. La propiedad ImageAttributeMetadata.CanStoreFullImage controla si una columna de imagen almacena una imagen de tamaño completo.

Detecte qué columnas de imágenes admiten imágenes de tamaño completo

Puede consultar la tabla Image Attribute Configuration (AttributeImageConfig) para recuperar una lista de columnas de imagen que admiten imágenes de tamaño completo utilizando los valores de columna parententitylogicalname, attributelogicalname y canstorefullimage.

El método estático PrintFullSizedImageColumns escribe los nombres de las columnas de tabla e imagen que pueden almacenar imágenes de tamaño completo.

static void PrintFullSizedImageColumns(IOrganizationService service)
{
    QueryExpression query = new QueryExpression("attributeimageconfig")
    {
        ColumnSet = new ColumnSet("parententitylogicalname", "attributelogicalname"),
        Criteria = new FilterExpression(LogicalOperator.And)
        {
            Conditions =
            {
                new ConditionExpression(
                    attributeName: "canstorefullimage",
                    conditionOperator: ConditionOperator.Equal,
                    value: true)
            }
        }
    };

    EntityCollection response = service.RetrieveMultiple(query);
    foreach (Entity record in response.Entities)
    {
        Console.WriteLine($"{record["parententitylogicalname"]}.{record["attributelogicalname"]}");
    }
}

Salida

account.sample_sampleimage

También puede consultar las definiciones de esquema para devolver columnas donde la propiedad ImageAttributeMetadata.CanStoreFullImage es true. Para obtener más información, consulte Definiciones de esquema de consulta.

Reglas de cambio de tamaño para imágenes en miniatura

Para generar una imagen de tamaño en miniatura, Dataverse recorta y cambia el tamaño de la imagen a una forma cuadrada según las reglas siguientes:

  • Si al menos un lado de la imagen es mayor que 144 píxeles, Dataverse recorta la imagen en el centro a 144 x 144 píxeles.
  • Si ambos lados de la imagen son inferiores a 144 píxeles, Dataverse recorta el cuadrado de la imagen al lado más pequeño.

En la siguiente tabla se muestran dos ejemplos.

Antes Después
Imagen antes de cambio de tamaño

300x428
imagen después de cambiar el tamaño

144x144
cambio de tamaño a imagen más pequeña antes

91x130
imagen más pequeña después del cambio de tamaño

91x91

Imágenes principales

Cada tabla puede tener varias columnas de imagen, pero solo puede definir una columna de imagen como imagen principal. Solo puede establecer la imagen principal mediante una operación de creación. Para obtener más información, vea Establecer solo imágenes principales para la operación de creación.

La propiedad ImageAttributeMetadata.IsPrimaryImage controla qué columna de imagen representa la imagen principal de la tabla.

La propiedad EntityMetadata.PrimaryImageAttribute devuelve el nombre lógico de la columna de imagen que es la imagen principal actual para la tabla.

También puede consultar la tabla Entity Image Configuration (EntityImageConfig) para determinar qué columnas de imagen representan la imagen principal actual mediante los valores de columna parententitylogicalname y primaryimageattribute .

El método estático PrintPrimaryImageColumns del ejemplo siguiente escribe los nombres de columnas de tabla e imagen para todas las columnas de imagen principal.

static void PrintPrimaryImageColumns(IOrganizationService service)
{
    QueryExpression query = new QueryExpression("entityimageconfig")
    {
        ColumnSet = new ColumnSet("parententitylogicalname", "primaryimageattribute"),
    };

    EntityCollection response = service.RetrieveMultiple(query);
    foreach (Entity record in response.Entities)
    {
        Console.WriteLine($"{record["parententitylogicalname"]}.{record["primaryimageattribute"]}");
    }
}

Salida

account.sample_sampleimage

Más información: Crear consultas con QueryExpression

Descargar URL

Cada columna de imagen tiene las siguientes columnas complementarias, pero ninguna de ellas aparece dentro del diseñador Power Apps.

Columna Tipo Convención de nomenclatura Descripción
Identificador de imagen Identificador único <image column name>Id Un identificador único para la imagen.
Marca de tiempo BigInt <image column name>_Timestamp Representa cuando la imagen se actualizó por última vez. Este valor ayuda a garantizar que se descargue la última versión de la imagen en lugar de que el cliente use una versión en caché que se recuperó antes.
Dirección URL string <image column name>_URL Una URL relativa para descargar una versión en miniatura de la imagen

Los valores de la columna ID de imagen y marca de tiempo no tienen ningún caso de uso, excepto que están acostumbrados dentro del valor de la columna de cadena de URL.

Cuando la columna de un registro contiene datos, la dirección URL de descarga es una dirección URL relativa que usa el formato siguiente:

/Image/download.aspx?Entity=<entity logical name>&Attribute=<image column logical name>&Id=<image id value>&Timestamp=<time stamp value>

Puede anexar este valor al URI de la organización para crear una dirección URL que puede usar para descargar el archivo de imagen de tamaño de miniatura. Por ejemplo:

https://yourorg.crm.dynamics.com/Image/download.aspx?Entity=account&Attribute=sample_imagecolumn&Id=7a4814f9-b0b8-ea11-a812-000d3a122b89&Timestamp=637388308718090885

URL para descargar la imagen a tamaño completo

Si la columna de imagen está configurada para almacenar imágenes de tamaño completo, puede anexar &Full=true a la dirección URL y el vínculo descarga la imagen de tamaño completo. Por ejemplo:

https://yourorg.crm.dynamics.com/Image/download.aspx?Entity=account&Attribute=sample_imagecolumn&Id=7a4814f9-b0b8-ea11-a812-000d3a122b89&Timestamp=637388308718090885&Full=true

Si la columna no está configurada para almacenar imágenes de tamaño completo, la solicitud no devuelve datos.

Usar datos de imagen con registros

Al trabajar con registros, la forma en que controla los datos de imagen depende de si usa el SDK o la API web.

El siguiente método estático RetrieveAndUpdateImageColumn recupera un byte[] valor de imagen de una columna, lo guarda localmente y carga una nueva imagen.

static void RetrieveAndUpdateImageColumn(
    IOrganizationService service,
    Guid accountid,
    string imageColumnLogicalName) 
{

    // Retrieve account with image
    Entity account = service.Retrieve(
        entityName: "account",
        id: accountid, 
        columnSet: new ColumnSet(imageColumnLogicalName));

    // Save the image retrieved
    File.WriteAllBytes(
        path: "original_image.png",
        bytes: account.GetAttributeValue<byte[]>(imageColumnLogicalName));


    // Instantiate a new entity for update with new image
    Entity accountForUpdate = new("account") { 
        Attributes = {
            { "accountid", accountid },
            { imageColumnLogicalName , File.ReadAllBytes("new_image.png")}
        }
    };

    // Update the account
    service.Update(accountForUpdate);               
}

Nota

Si establece la propiedad ColumnSet.AllColumns en true, la consulta no incluye columnas de imagen. Por motivos de rendimiento, debe especificar explícitamente que desea recuperar datos de imagen.

Más información:

Establecer solo imágenes principales para la operación de creación

Al crear un registro, establezca solo el valor de la columna de imagen principal actual. Si intenta establecer el valor de cualquier otra columna de imagen, recibirá este mensaje de error:

Nombre: CannotUploadNonPrimaryImageAttributeOnCreate
Código: 0x80090487
Número: -2146892665
Mensaje: Non-primary image attribute <image column logical name> of entity <table logical name> is not allowed to upload during Create operation.

Para obtener más información, consulte Imágenes principales.

Recuperar solo imágenes en miniatura

Los datos de imagen a los que accede a través de las propiedades de registro siempre son las imágenes de tamaño de miniatura. Para acceder a las imágenes en tamaño completo, debe descargarlas. Para obtener más información, consulte Descargar imágenes.

Cargar imágenes

Para cargar imágenes, use las mismas API que usa para cargar archivos. Para obtener más información, vea Cargar archivos.

Descargar imágenes

Para descargar imágenes, use las mismas API que usa para descargar archivos. Tenga en cuenta las siguientes diferencias.

Usar mensajes de Dataverse

Si usa los mensajes InitializeFileBlocksDownload y DownloadBlock, siempre descargará la imagen en tamaño original si la columna de imagen lo permite. No se puede descargar la imagen de tamaño de miniatura mediante este método. Para obtener más información, consulte Uso de mensajes de Dataverse para descargar un archivo.

Si la columna de imagen no admite imágenes de tamaño completo o si la propiedad ImageAttributeMetadata.CanStoreFullImage es false al cargar la imagen, se devuelve el siguiente error:

Nombre: ObjectDoesNotExist
Código: 0x80040217
Número: -2147220969
Mensaje: No FileAttachment records found for imagedescriptorId: <guid> for image attribute: <image column logical name> of <entity logical name> record with id <guid>.

Uso de la API web

Al descargar imágenes mediante la API web sin usar los mensajes de Dataverse, se descarga la imagen de tamaño de miniatura de forma predeterminada. Para descargar la imagen de tamaño completo, anexe este parámetro a la dirección URL: ?size=full.

Si la columna de imagen no admite imágenes de tamaño completo o si la propiedad ImageAttributeMetadata.CanStoreFullImage es false al cargar la imagen, la respuesta devuelve 204 No Content.

Para obtener más información, vea Descargar archivos.

Eliminar imágenes

Puede eliminar imágenes configurando el valor de la columna de imagen para el registro en nulo como lo haría con cualquier otra propiedad.

Establezca el valor del atributo image en NULL y actualice la entidad. Para obtener más información, consulte Actualización básica.

Consulte también

Información general sobre imágenes y archivos
Trabajar con definiciones de columna de imagen mediante código
Ejemplo: Operaciones de imagen usando la SDK de Dataverse para .NET
Ejemplo: Operaciones de imagen usando la API web de Dataverse
Usar datos de columna de archivo