Compartilhar via


Usar dados de coluna de imagem

Você pode armazenar dados de imagem no Dataverse usando colunas de imagem ou colunas de arquivo. Você pode usar muitas das APIs para colunas de arquivo com colunas de imagem. As colunas de imagem têm alguns comportamentos especiais e limitações para dar suporte à exibição de imagens em aplicativos.

A tabela a seguir apresenta algumas das diferenças entre colunas de imagem e arquivo.

Imagem Arquivo
File Size. Limitado a 30 MB. Até 10 GB. Embora a API possa manipular arquivos de até 10 GB de tamanho, os controles de cliente do Power Apps atualmente só dão suporte a arquivos de até 128 MB. Exceder o valor de 128 MB ao usar esses controles resultará em erros ao carregar ou baixar arquivos.
Tipos de arquivo Somente tipos de arquivo de imagem Todos os tipos de arquivo permitidos pelo valor Organization.BlockedAttachments. Mais informações: bloquear determinados tipos de arquivos
Configurar com Atualização Você pode configurar dados de coluna de imagem juntamente com outros dados de registro usando a função de atualização. Você só pode carregar arquivos individualmente nas propriedades da coluna de arquivo.
Excluir através de Atualização Você pode excluir dados da coluna de imagem definindo o atributo ou a propriedade para null e, em seguida, atualizar o registro. Mais informações: Excluir imagens Você só pode excluir dados da coluna de arquivo usando a DeleteFile mensagem ou enviando uma DELETE solicitação para a coluna específica usando a API Web. Mais informações: Excluir Arquivos
Configurar com Criar Quando a coluna de imagem é a imagem primária, você pode definir dados de imagem com outros dados de registro usando create. Mais informações: Imagens Primárias Você só pode carregar arquivos individualmente nas propriedades da coluna de arquivo depois que o registro foi criado.
Retornar com Recuperação Você pode obter imagens em tamanho de thumbnail, junto com outros dados de registro, usando a função de recuperação. O valor retornado é a ID do arquivo. Mais informações: Comportamento ao recuperar
Baixar URL Cada coluna de imagem tem uma coluna de cadeia de caracteres que contém uma URL relativa que você pode incluir em um aplicativo que permite baixar o arquivo de imagem. Mais informações: Baixar URL Não há nenhuma coluna de cadeia de caracteres com uma URL de download, mas você pode compor uma URL para baixar o arquivo diretamente da API Web. Mais informações: baixar um arquivo em uma única solicitação usando a API Web

Tamanho máximo da imagem

Assim como as colunas de arquivo, você pode especificar o tamanho máximo dos dados armazenados em uma coluna de imagem usando a MaxSizeInKb propriedade. No entanto, o tamanho máximo permitido é de 30 MB.

Se você tentar carregar um arquivo muito grande, receberá o seguinte erro:

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

Você pode usar os seguintes exemplos para verificar o tamanho máximo do arquivo:

O método estático GetImageColumnMaxSizeInKb a seguir retorna o valor MaxSizeInKB para a coluna 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.");
   }
}

Mais informações:

Tipos de arquivo de imagem

As colunas de imagem armazenam os seguintes tipos de imagem binária:

Formato de Arquivo tipo de MIME Extensão de arquivo
formato GIF image/gif .gif
Imagem conjunta do Grupo de Especialistas Fotográficos image/jpeg .jpg, .jpeg
Arquivo bitmap image/bmp .bmp
formato PNG image/png .png

Se você tentar salvar um arquivo que não é um desses tipos, você receberá o seguinte erro:

Nome: ProcessImageFailure
Código: 0x80072553
Número: -2147015341
Mensagem: 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

Imagens em tamanho real e em miniatura

Quando um valor de coluna de imagem é definido, o Dataverse gerará automaticamente uma imagem do tamanho de miniatura adequada para uso como um ícone em um aplicativo.

Se a coluna de imagem estiver configurada para armazenar uma imagem de tamanho completo, um arquivo até o configurado MaxSizeInKb poderá ser salvo e baixado separadamente da imagem em tamanho de miniatura. A propriedade ImageAttributeMetadata.CanStoreFullImage controla se uma coluna de imagem armazenará uma imagem de tamanho completo.

Detectar quais colunas de imagem dão suporte a imagens de tamanho completo

Você pode consultar a tabela Configuração de Atributo de Imagem (AttributeImageConfig) para recuperar uma lista de colunas de imagem que suportam imagens de tamanho completo usando os valores das colunas parententitylogicalname, attributelogicalname e canstorefullimage.

O método estático PrintFullSizedImageColumns gravará os nomes das colunas de tabela e imagem que podem armazenar imagens de tamanho 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"]}");
    }
}

Output

account.sample_sampleimage

Você também pode consultar definições de esquema para retornar colunas em que a propriedade ImageAttributeMetadata.CanStoreFullImage é verdadeira. Mais informações: Definições de esquema de consulta

Regras de redimensionamento para imagens em miniatura

Para gerar uma imagem em miniatura, o Dataverse cortará e redimensionará a imagem em uma forma quadrada de acordo com as seguintes regras:

  • Imagens com pelo menos um lado maior que 144 pixels são cortadas no centro para 144 x 1444.
  • Imagens em que ambos os lados são menores que 144 são cortadas em formato quadrado com base no menor lado.

A tabela a seguir mostra dois exemplos.

Antes Após
Imagem antes do redimensionamento

300x428
imagem após redimensionar

144x144
redimensionar imagem menor antes

91x130
redimensionar imagem menor após

91x91

Imagens primárias

Cada tabela pode ter várias colunas de imagem, mas apenas uma coluna de imagem pode ser definida como a imagem primária. Somente a imagem primária pode ser definida com uma operação de criação. Mais informações: somente imagens primárias podem ser definidas para criar

A propriedade ImageAttributeMetadata.IsPrimaryImage controla qual coluna de imagem representa a imagem primária da tabela.

A propriedade EntityMetadata.PrimaryImageAttribute retorna o nome lógico da coluna de imagem que é a imagem primária atual da tabela.

Você também pode consultar a tabela Entity Image Configuration (EntityImageConfig) para determinar quais colunas de imagem representam a imagem primária atual, usando os valores de coluna parententitylogicalname e primaryimageattribute.

O método estático PrintPrimaryImageColumns abaixo escreverá os nomes das colunas de tabela e imagem de todas as colunas primárias de imagem.

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"]}");
    }
}

Output

account.sample_sampleimage

Mais informações: Criar consultas com QueryExpression

Baixar URL

Cada coluna de imagem tem as seguintes colunas complementares, mas nenhuma delas aparece no designer do Power Apps .

Coluna Tipo Convenção de nomenclatura Descrição
ID da imagem Identificador exclusivo <image column name>Id Um identificador exclusivo para a imagem.
Carimbo de Data/Hora BigInt <image column name>_Timestamp Representa quando a imagem foi atualizada pela última vez. Esse valor ajuda a garantir que a versão mais recente da imagem seja baixada em vez do cliente usando uma versão em cache que foi recuperada antes.
URL cadeia <image column name>_URL Uma URL relativa para baixar uma versão em miniatura da imagem

O ID da imagem e os valores da coluna de carimbo de data/hora não têm nenhum caso de uso, exceto quando são utilizados no valor da coluna da cadeia de caracteres de URL.

Quando a coluna de um registro contiver dados, a URL de download será uma URL relativa usando o seguinte formato:

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

Você pode acrescentar esse valor ao URI da organização para construir uma URL que pode ser usada para baixar o arquivo de imagem do tamanho de miniatura. Por exemplo:

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

URL para baixar imagem de tamanho completo

Se a coluna de imagem estiver configurada para armazenar imagens de tamanho completo, você poderá acrescentar &Full=true à URL e o link baixará a imagem em tamanho completo. Por exemplo:

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

Se a coluna não estiver configurada para armazenar imagens de tamanho completo, nenhum dado será retornado.

Usar dados de imagem com registros

Quando você está trabalhando com registros, como trabalha com dados de imagem depende se você está usando o SDK ou a API Web.

O seguinte método estático RetrieveAndUpdateImageColumn recupera o valor de imagem byte[] da coluna, salva-o localmente e carrega uma nova imagem.

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);               
}

Observação

As colunas de imagem não serão incluídas se você definir a propriedade ColumnSet.AllColumns como true. Por motivos de desempenho, você deve especificar explicitamente que deseja recuperar dados de imagem.

Mais informações:

Somente imagens primárias podem ser definidas para criar

Ao criar um registro, você só pode definir o valor da coluna de imagem primária atual. Se você tentar definir o valor de qualquer outra coluna de imagem, receberá este erro:

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

Mais informações: Imagens Primárias

Somente imagens em miniatura podem ser recuperadas

Os dados de imagem acessados por meio de propriedades de registro sempre serão as imagens em miniatura. Para acessar imagens de tamanho completo, você deve baixá-las. Mais informações: Baixar imagens

Carregar imagens

Use as mesmas APIs que você usa para carregar arquivos para carregar imagens individualmente. Mais informações: Carregar arquivos

Baixar imagens

Use as mesmas APIs que você usa para baixar arquivos para baixar imagens, mas esteja ciente das diferenças a seguir.

Usando mensagens do Dataverse

Se você usar as mensagens InitializeFileBlocksDownload e DownloadBlock, a imagem de tamanho completo sempre será baixada se a coluna de imagem der suporte a elas. Você não pode baixar a imagem em miniatura usando esse método. Mais informações: usar mensagens do Dataverse para baixar um arquivo

Se a coluna de imagem não der suporte a imagens de tamanho completo ou se a propriedade ImageAttributeMetadata.CanStoreFullImage for falsa quando a imagem foi carregada, o seguinte erro será retornado:

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

Usando a API Web

Quando você baixa imagens usando a API Web sem usar as mensagens do Dataverse, a imagem em miniatura será baixada por padrão. Para baixar a imagem de tamanho completo, você deve acrescentar esse parâmetro à URL: ?size=full.

Se a coluna de imagem não der suporte a imagens de tamanho completo ou se a propriedade ImageAttributeMetadata.CanStoreFullImage for falsa quando a imagem foi carregada, a resposta retornará 204 No Content.

Mais informações: Baixar arquivos

Excluir imagens

Você pode excluir imagens definindo o valor da coluna de imagem para o registro como nulo como faria para qualquer outra propriedade.

Basta definir o valor do atributo de imagem como nulo e atualizar a entidade. Mais informações: Atualização básica

Consulte também

Visão geral de arquivos e imagens
Trabalhar com definições de coluna de imagem usando código
Exemplo: Operações de imagem usando o SDK do Dataverse para .NET
Exemplo: Operações de imagem usando a API Web do Dataverse
Usar dados da coluna do arquivo