Partager via


Utiliser des données de colonne de fichier dans Microsoft Dataverse

Les colonnes de fichier dans Microsoft Dataverse diffèrent des autres colonnes système qui stockent des données binaires, car vous ne pouvez pas définir directement les valeurs dans une opération de création ou de mise à jour, ou récupérer les données de fichier avec l’enregistrement. Pour créer, récupérer, mettre à jour ou supprimer des données binaires pour les colonnes de fichiers, utilisez les méthodes décrites dans cet article. Découvrez comment charger, télécharger et supprimer des fichiers à l’aide du Kit de développement logiciel (SDK) pour .NET et de l’API web, notamment la prise en charge des transferts segmentés de fichiers volumineux.

Vous pouvez utiliser des données de colonne de fichiers à l’aide de plusieurs méthodes différentes via l’API web. Toutes les méthodes sont prises en charge de façon égale. Choisissez donc la méthode qui vous convient le mieux. Étant donné que les fichiers binaires peuvent être volumineux, vous devez souvent fractionner le fichier en plusieurs blocs (ou blocs) que vous pouvez envoyer ou recevoir séquentiellement ou en parallèle pour améliorer les performances.

Colonne du nom de fichier

Chaque colonne de fichier est accompagnée d'une colonne textuelle en lecture seule qui contient le nom du fichier. Le nom de schéma de cette colonne a le même nom que la colonne de fichier, mais avec _Name ajouté à celui-ci. Par conséquent, si le nom du schéma est sample_FileColumn, la colonne de chaîne associée est sample_FileColumn_Name. Le nom logique de la colonne de support est sample_filecolumn_name.

Note

La colonne de nom de fichier n’apparaît pas dans le concepteur Power Apps .

Relation avec la table FileAttachment

Lorsque vous créez une colonne de fichier pour une table, vous créez également une nouvelle relation un-à-plusieurs entre cette table et la FileAttachment table. Le nom de la relation est {table logical name}_FileAttachments. Par exemple, si la colonne de fichier fait partie de la table de compte, le nom de la relation est account_FileAttachments.

Vous pouvez utiliser cette relation pour renvoyer davantage de données sur la colonne de fichier et toute autre colonne de fichier pour la table. Pour plus d’informations, consultez Récupérer des informations supplémentaires sur les fichiers d’un enregistrement

Comportement lors de la récupération

Lorsque vous récupérez un enregistrement et incluez une colonne de fichier, la valeur retournée est un identificateur unique pour le fichier. Vous pouvez utiliser cette valeur pour supprimer le fichier à l’aide du DeleteFile message. Il n’y a pas d’autre utilisation pour cet ID que de vérifier si la colonne a une valeur. Pour plus d’informations, consultez Utiliser le message DeleteFile.

Les exemples suivants montrent ce que vous pouvez attendre lors de la récupération de données à partir de colonnes de fichiers, comme vous le feriez avec d’autres colonnes.

Ces exemples récupèrent les colonnes name, sample_filecolumn et sample_filecolumn_name pour un enregistrement de compte :

static void RetrieveAccountRecordWithFileColumns(
    IOrganizationService service,
    Guid accountid) 
{

   Entity account = service.Retrieve(
         "account", 
         accountid, 
         new ColumnSet("name", "sample_filecolumn", "sample_filecolumn_name"));

   Console.WriteLine($"name: {account["name"]}");
   Console.WriteLine($"sample_filecolumn: {account["sample_filecolumn"]}");
   Console.WriteLine($"sample_filecolumn_name: {account["sample_filecolumn_name"]}");
}

Sortie :

name: Contoso Ltd.
sample_filecolumn: <file id>
sample_filecolumn_name: 25mb.pdf

Pour plus d’informations :

Récupérer des informations supplémentaires sur les fichiers d’un enregistrement

Vous pouvez utiliser la relation entre la table de colonnes de fichier et la FileAttachment table pour retourner des informations sur toutes les colonnes de fichier associées à cette ligne de table.

La méthode statique RetrieveAccountRecordWithFileData montre comment renvoyer des informations sur toutes les colonnes de fichier contenant des données liées à l’enregistrement account avec la valeur accountid correspondante.

static void RetrieveAccountRecordWithFileData(
    IOrganizationService service, 
    Guid accountid)
{
    // Create query for related records
    var relationshipQueryCollection = new RelationshipQueryCollection {
        {
            new Relationship("account_FileAttachments"),
            new QueryExpression("fileattachment"){
                ColumnSet = new ColumnSet(
                                "createdon",
                                "mimetype",
                                "filesizeinbytes",
                                "filename",
                                "regardingfieldname",
                                "fileattachmentid")
            }
        }
    };

    // Include the related query with the Retrieve Request
    RetrieveRequest request = new RetrieveRequest
    {
        ColumnSet = new ColumnSet("accountid"),
        RelatedEntitiesQuery = relationshipQueryCollection,
        Target = new EntityReference("account", accountid)
    };

    // Send the request
    RetrieveResponse response = (RetrieveResponse)service.Execute(request);

    //Display related FileAttachment data for the account record
    response.Entity.RelatedEntities[new Relationship("account_FileAttachments")]
        .Entities.ToList().ForEach(e =>
        {
            Console.WriteLine($"createdon: {e.FormattedValues["createdon"]}");
            Console.WriteLine($"mimetype: {e["mimetype"]}");
            Console.WriteLine($"filesizeinbytes: {e.FormattedValues["filesizeinbytes"]}");
            Console.WriteLine($"filename: {e["filename"]}");
            Console.WriteLine($"regardingfieldname: {e["regardingfieldname"]}");
            Console.WriteLine($"fileattachmentid: {e["fileattachmentid"]}");
        });
}

Sortie :

Dans ce cas, il y a une seule colonne de fichier dans la table des comptes nommée sample_filecolumn, et il s’agit des données sur le fichier stocké dans cette colonne.

createdon: 10/22/2022 2:01 PM
mimetype: application/pdf
filesizeinbytes: 25,870,370
filename: 25mb.pdf
regardingfieldname: sample_filecolumn
fileattachmentid: 63a6afb7-4c52-ed11-bba1-000d3a9933c9

Pour plus d’informations :

Télécharger des fichiers

Vous pouvez charger des fichiers dans une colonne de fichiers de trois façons différentes :

  • Utiliser les messages Dataverse disponibles à la fois pour le SDK et l’API Web
  • Charger un fichier dans une seule requête à l’aide de l’API web
  • Charger le fichier en blocs à l’aide de l’API web

Note

Utiliser les messages Dataverse pour charger un fichier

Vous pouvez utiliser des messages Dataverse à l’aide du Kit de développement logiciel (SDK) pour .NET ou l’API web. Charger un fichier de cette manière nécessite d’utiliser un ensemble de trois messages :

Message Description
InitializeFileBlocksUpload Utilisez ce message pour indiquer la colonne dans laquelle vous souhaitez charger un fichier. Elle retourne un jeton de continuation de fichier que vous pouvez utiliser pour téléverser le fichier en blocs à l’aide du message UploadBlock et de CommitFileBlocksUpload.
UploadBlock Fractionnez votre fichier en blocs et générez un blockid pour chaque bloc. Effectuez ensuite plusieurs requêtes jusqu’à ce que tous les blocs soient envoyés avec le jeton de continuation de fichier.
CommitFileBlocksUpload Une fois que vous avez envoyé des demandes pour tous les blocs à l’aide UploadBlockde ce message, utilisez ce message pour valider l’opération de chargement en envoyant :
- La liste des identifiants de bloc générés
- Le nom du fichier
- Le type MIME du fichier
- Le jeton de continuation de fichier

Pour charger un fichier ou une image, utilisez une fonction comme celle suivante qui utilise les classes InitializeFileBlocksUploadRequest, UploadBlockRequest et CommitFileBlocksUploadRequest .

/// <summary>
/// Uploads a file or image column value
/// </summary>
/// <param name="service">The service</param>
/// <param name="entityReference">A reference to the record with the file or image column</param>
/// <param name="fileAttributeName">The name of the file or image column</param>
/// <param name="fileInfo">Information about the file or image to upload.</param>
/// <param name="fileMimeType">The mime type of the file or image, if known.</param>
/// <returns></returns>
static Guid UploadFile(
         IOrganizationService service,
         EntityReference entityReference,
         string fileAttributeName,
         FileInfo fileInfo,
         string fileMimeType = null)
{

   // Initialize the upload
   InitializeFileBlocksUploadRequest initializeFileBlocksUploadRequest = new()
   {
         Target = entityReference,
         FileAttributeName = fileAttributeName,
         FileName = fileInfo.Name
   };

   var initializeFileBlocksUploadResponse =
         (InitializeFileBlocksUploadResponse)service.Execute(initializeFileBlocksUploadRequest);

   string fileContinuationToken = initializeFileBlocksUploadResponse.FileContinuationToken;

   // Capture blockids while uploading
   List<string> blockIds = new();

   using Stream uploadFileStream = fileInfo.OpenRead();

   int blockSize = 4 * 1024 * 1024; // 4 MB

   byte[] buffer = new byte[blockSize];
   int bytesRead = 0;

   long fileSize = fileInfo.Length;
   // The number of iterations that will be required:
   // int blocksCount = (int)Math.Ceiling(fileSize / (float)blockSize);
   int blockNumber = 0;

   // While there is unread data from the file
   while ((bytesRead = uploadFileStream.Read(buffer, 0, buffer.Length)) > 0)
   {
         // The file or final block may be smaller than 4MB
         if (bytesRead < buffer.Length)
         {
            Array.Resize(ref buffer, bytesRead);
         }

         blockNumber++;

         string blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()));

         blockIds.Add(blockId);

         // Prepare the request
         UploadBlockRequest uploadBlockRequest = new()
         {
            BlockData = buffer,
            BlockId = blockId,
            FileContinuationToken = fileContinuationToken,
         };

         // Send the request
         service.Execute(uploadBlockRequest);
   }

   // Try to get the mimetype if not provided.
   if (string.IsNullOrEmpty(fileMimeType))
   {
         var provider = new FileExtensionContentTypeProvider();

         if (!provider.TryGetContentType(fileInfo.Name, out fileMimeType))
         {
            fileMimeType = "application/octet-stream";
         }
   }

   // Commit the upload
   CommitFileBlocksUploadRequest commitFileBlocksUploadRequest = new()
   {
         BlockList = blockIds.ToArray(),
         FileContinuationToken = fileContinuationToken,
         FileName = fileInfo.Name,
         MimeType = fileMimeType
   };

   var commitFileBlocksUploadResponse =
         (CommitFileBlocksUploadResponse)service.Execute(commitFileBlocksUploadRequest);

   return commitFileBlocksUploadResponse.FileId;

}

Pour plus d’informations :

Note

Cet exemple de méthode comprend une certaine logique pour essayer d’obtenir le Type MIME du fichier en utilisant la méthode FileExtensionContentTypeProvider.TryGetContentType(String, String), s’il n’est pas fourni. Si le type est introuvable, il est défini sur application/octet-stream.

Charger un fichier dans une seule requête à l’aide de l’API web

Si la taille du fichier est inférieure à 128 Mo, vous pouvez charger le fichier dans une seule requête à l’aide de l’API web.

L’exemple suivant charge un fichier texte nommé 4094kb.txt dans la colonne de fichier nommée sample_filecolumn de la table account pour un enregistrement avec accountid égal à <accountid>.

Demande :

PATCH [Organization Uri]/api/data/v9.2/accounts(<accountid>)/sample_filecolumn HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json
Content-Type: application/octet-stream
x-ms-file-name: 4094kb.txt
Content-Length: 4191273

< binary content removed for brevity>

Réponse :

HTTP/1.1 204 NoContent
OData-Version: 4.0

Exemple PowerShell pour charger un fichier en une seule requête

La fonction PowerShell Set-FileColumn suivante montre comment charger un fichier dans une seule requête à l’aide de l’API web.

Pour en savoir plus sur l’utilisation de PowerShell et de Visual Studio Code avec l’API web Dataverse, consultez :

Cette fonction nécessite une connexion qui établit les paramètres globaux $baseURI et $baseHeaders. Définissez ces valeurs à l’aide de la Connect fonction décrite dans Créer une fonction Connect.

<#
.SYNOPSIS
Sets a column value for a file in a specified table.

.DESCRIPTION
The Set-FileColumn function sets a column value for a file in a specified table. 
It uses a single request and can work with files less than 128 MB.

.PARAMETER setName
The entity set name of the table where the file is stored.

.PARAMETER id
The unique identifier of record.

.PARAMETER columnName
The logical name of the file column to set the value for.

.PARAMETER file
The path to the file to upload.

.EXAMPLE
Set-FileColumn `
   -setName 'accounts' `
   -id [System.Guid]::New('12345678-1234-1234-1234-1234567890AB') `
   -columnName 'new_filecolumn' `
   -file 'C:\Path\To\File.txt'
   
Sets the value of the 'new_filecolumn' column for the file with the specified ID 
in the account table to the contents of the File.txt file.

#>
function Set-FileColumn {
   param (
      [Parameter(Mandatory)]
      [string]
      $setName,
      [Parameter(Mandatory)]
      [System.Guid]
      $id,
      [Parameter(Mandatory)]
      [string]
      $columnName,
      [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
      [System.IO.FileInfo]$file
   )

   $uri = '{0}{1}({2})/{3}' -f $baseURI, $setName, $id, $columnName

   $patchHeaders = $baseHeaders.Clone()
   $patchHeaders.Add('Content-Type', 'application/octet-stream')
   $patchHeaders.Add('x-ms-file-name', $file.Name)

   $body = [System.IO.File]::ReadAllBytes($file.FullName)

   $FileUploadRequest = @{
      Uri     = $uri
      Method  = 'Patch'
      Headers = $patchHeaders
      Body    = $body
   }

   Invoke-RestMethod @FileUploadRequest
}

Charger le fichier en blocs à l’aide de l’API web

Pour charger votre fichier en blocs à l’aide de l’API web, utilisez l’ensemble de requêtes suivant.

L’exemple suivant charge un fichier PDF nommé 25mb.pdf dans la colonne de fichier nommée sample_filecolumn de la table account pour un enregistrement avec accountid égal à <accountid>.

Demande :

La première requête doit inclure cet en-tête : x-ms-transfer-mode: chunked.

Définissez le nom du fichier à l’aide du x-ms-file-name paramètre de requête.

PATCH [Organization Uri]/api/data/v9.2/accounts(<accountid>)/sample_filecolumn?x-ms-file-name=25mb.pdf HTTP/1.1
x-ms-transfer-mode: chunked
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json

Note

Vous pouvez également inclure le nom de fichier en tant qu’en-tête de x-ms-file-name requête, mais cette approche ne prend pas en charge les noms de fichiers en dehors du jeu de caractères ASCII. Si vous utilisez l’en-tête, il est prioritaire sur le paramètre de requête x-ms-file-name.

Réponse :

HTTP/1.1 200 OK
Accept-Ranges: bytes
Location: [Organization Uri]/api/data/v9.2/accounts(<accountid>)/sample_filecolumn?sessiontoken=<sessiontoken value removed for brevity>
OData-Version: 4.0
x-ms-chunk-size: 4194304
Access-Control-Expose-Headers: x-ms-chunk-size

L’en-tête Location de la réponse comprend une URL à utiliser dans les requêtes ultérieures. Il inclut un sessiontoken paramètre de requête qui indique que toutes les requêtes envoyées à l’aide de celle-ci font partie de la même opération.

La réponse comprend les en-têtes suivants.

En-tête Description
x-ms-chunk-size Fournit une taille de bloc recommandée en octets.
Accept-Ranges Indique que le serveur prend en charge les requêtes partielles du client pour les téléchargements de fichier. La valeur bytes indique que la valeur de la plage dans les requêtes suivantes doit être en octets.
Access-Control-Expose-Headers Indique que la valeur d’en-tête x-ms-chunk-size doit être mise à la disposition des scripts qui s’exécutent dans le navigateur, en réponse à une requête cross-origin.

Demande :

Les requêtes ultérieures doivent utiliser la valeur de l’en-tête Location renvoyé par la première requête afin que la valeur sessiontoken soit incluse.

Chaque requête doit contenir cette partie du fichier dans le corps et les en-têtes suivants :

En-tête Description
x-ms-file-name Le nom du fichier.
Type de contenu Réglé sur application/octet-stream
Content-Range En utilisant ce format :
<unit> <range-start>-<range-end>/<size>
La valeur de la première requête : bytes 0-4194303/25870370 indique que la mesure utilise des octets. Cette requête comprend les 4194303 premiers octets d’un fichier d’une taille de 25870370 octets (presque 25 Mo).
Chaque requête suivante augmente cette valeur jusqu’à ce que l’intégralité du fichier soit envoyée :
bytes 4194304-8388607/25870370
bytes 8388608-12582911/25870370
bytes 12582912-16777215/25870370
bytes 16777216-20971519/25870370
bytes 20971520-25165823/25870370
bytes 25165824-25870369/25870370
Longueur-contenu Indique la taille du message. Dans l’exemple précédent, cette valeur pour la dernière requête est 704546 plutôt que 4194304.
PATCH [Organization Uri]/api/data/v9.2/accounts(<accountid>)/sample_filecolumn?sessiontoken=<sessiontoken value removed for brevity> HTTP/1.1
x-ms-file-name: 25mb.pdf
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json
Content-Type: application/octet-stream
Content-Range: bytes 0-4194303/25870370
Content-Length: 4194304

< byte[] content removed for brevity>

Pour chaque requête contenant du contenu partiel, la réponse est 206 PartialContent.

Réponse :

HTTP/1.1 206 PartialContent
OData-Version: 4.0

Pour la demande finale qui inclut le dernier segment du fichier, la réponse est 204 NoContent.

Réponse :

HTTP/1.1 204 NoContent
OData-Version: 4.0

Exemple PowerShell pour charger un fichier en blocs

La fonction PowerShell suivante Set-FileColumnInChunks montre comment charger un fichier en blocs. Cette fonction nécessite une connexion qui définit les variables globales $baseURI et $baseHeaders à l’aide de la fonction Connect décrite dans « Créer une fonction Connect ».

<#
.SYNOPSIS
Sets a column value for a file in a specified table.

.DESCRIPTION
The Set-FileColumnInChunks function sets a column value for a file in a specified table. 
It uses chunked file upload to efficiently upload large files.

.PARAMETER setName
The name of the table where the file is stored.

.PARAMETER id
The unique identifier of record.

.PARAMETER columnName
The logical name of the file column to set the value for.

.PARAMETER file
The path to the file to upload.

.EXAMPLE
Set-FileColumnInChunks `
   -setName 'accounts' `
   -id [System.Guid]::New('12345678-1234-1234-1234-1234567890AB') `
   -columnName 'new_filecolumn' `
   -file 'C:\Path\To\File.txt'
   
Sets the value of the 'new_filecolumn' column for the file with the specified ID in the account table to the contents of the File.txt file.

#>
function Set-FileColumnInChunks {
   param (
      [Parameter(Mandatory)]
      [string]
      $setName,
      [Parameter(Mandatory)]
      [System.Guid]
      $id,
      [Parameter(Mandatory)]
      [string]
      $columnName,
      [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
      [System.IO.FileInfo]$file
   )

   $uri = '{0}{1}({2})' -f $baseURI, $setName, $id
   $uri += '/{0}?x-ms-file-name={1}' -f $columnName, $file.Name

   $chunkHeaders = $baseHeaders.Clone()
   $chunkHeaders.Add('x-ms-transfer-mode', 'chunked')

   $InitializeChunkedFileUploadRequest = @{
      Uri     = $uri
      Method  = 'Patch'
      Headers = $chunkHeaders
   }

   Invoke-RestMethod @InitializeChunkedFileUploadRequest `
      -ResponseHeadersVariable rhv

   $locationUri = $rhv['Location'][0]
   $chunkSize = [int]$rhv['x-ms-chunk-size'][0]

   $bytes = [System.IO.File]::ReadAllBytes($file.FullName)

   for ($offset = 0; $offset -lt $bytes.Length; $offset += $chunkSize) {
         
      $count = if (($offSet + $chunkSize) -gt $bytes.Length) 
                  { $bytes.Length % $chunkSize } 
               else { $chunkSize }
      
      $lastByte = $offset + ($count - 1)

      $range = 'bytes {0}-{1}/{2}' -f $offset, $lastByte, $bytes.Length

      $contentHeaders = $baseHeaders.Clone()
      $contentHeaders.Add('Content-Range', $range)
      $contentHeaders.Add('Content-Type', 'application/octet-stream')
      $contentHeaders.Add('x-ms-file-name', $file.Name)

      $UploadFileChunkRequest = @{
         Uri     = $locationUri
         Method  = 'Patch'
         Headers = $contentHeaders
         Body    = [byte[]]$bytes[$offSet..$lastByte]
      }

      Invoke-RestMethod @UploadFileChunkRequest
   }
}

Vérifier la taille de fichier maximale

Avant de charger un fichier, vérifiez si la taille du fichier dépasse la taille de fichier maximale configurée stockée dans la MaxSizeInKB propriété.

Si vous essayez de charger un fichier trop volumineux, vous obtenez le message d’erreur suivant :

Nom: unManagedidsattachmentinvalidfilesize
Code : 0x80044a02
Nombre : -2147202558
Message : Attachment file size is too big.

Utilisez les exemples suivants pour vérifier la taille maximale du fichier :

La méthode GetFileColumnMaxSizeInKb statique renvoie la valeur MaxSizeInKB d’une colonne de fichier.

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

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

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

   if (retrieveAttributeResponse.AttributeMetadata is FileAttributeMetadata fileColumn)
   {
         return fileColumn.MaxSizeInKB.Value;
   }
   else
   {
         throw new Exception($"{entityLogicalName}.{fileColumnLogicalName} is not a file column.");
   }
}

Pour plus d’informations :

Télécharger des fichiers

Vous pouvez utiliser trois méthodes différentes pour télécharger des fichiers à partir d’une colonne de fichier :

  • Utiliser les messages Dataverse disponibles à la fois pour le SDK et l’API Web
  • Télécharger un fichier dans une seule requête à l’aide de l’API web
  • Télécharger le fichier en blocs à l’aide de l’API web

Note

Vous pouvez également utiliser ces méthodes pour télécharger des colonnes d’image, mais il existe des différences. Pour plus d’informations, consultez Télécharger des images.

Pour les environnements locaux ou lorsqu’un environnement utilise une clé auto-managée (BYOK), le fichier n’est pas dans le stockage de fichiers. Lorsqu’un fichier n’est pas dans le stockage de fichiers, le téléchargement en plusieurs blocs n’est pas pris en charge. La classe ComplexType InitializeFileBlocksDownloadResponse et InitializeFileBlocksDownloadResponse ont une IsChunkingSupported propriété qui indique si le fichier peut être téléchargé en plusieurs blocs ou non. Si la segmentation n’est pas prise en charge, la BlockLength valeur est définie sur la taille du fichier.

La tentative de téléchargement d’un bloc partiel lorsqu’elle IsChunkingSupported est définie sur false entraîne cette erreur :

Nom: UploadingAndDownloadingInMultipleChunksNotSupported
Code : 0x80090017
Message : Downloading in multiple chunks isn't supported for the files stored in the database.

Utilisez les messages Dataverse pour télécharger un fichier

Vous pouvez utiliser des messages Dataverse à l’aide du Kit de développement logiciel (SDK) pour .NET ou l’API web. Télécharger un fichier de cette manière nécessite d’utiliser une paire de messages :

Message Description
InitializeFileBlocksDownload Utilisez ce message pour indiquer la colonne à partir de laquelle vous souhaitez télécharger un fichier. Elle retourne la taille du fichier en octets et un jeton de continuation de fichier que vous pouvez utiliser pour télécharger le fichier en blocs à l’aide du DownloadBlock message.
DownloadBlock Demandez la taille du bloc, demandez la valeur de décalage et demandez le jeton de continuation de fichier.

Après avoir téléchargé tous les blocs, vous devez les joindre pour créer l’intégralité du fichier téléchargé.

Vous pouvez utiliser une fonction comme celle-ci pour télécharger un fichier ou une image à l’aide du Kit de développement logiciel (SDK) et des classes InitializeFileBlocksDownloadRequest et DownloadBlockRequest .

/// <summary>
/// Downloads a file or image
/// </summary>
/// <param name="service">The service</param>
/// <param name="entityReference">A reference to the record with the file or image column</param>
/// <param name="attributeName">The name of the file or image column</param>
/// <returns></returns>
private static byte[] DownloadFile(
            IOrganizationService service,
            EntityReference entityReference,
            string attributeName)
{
   InitializeFileBlocksDownloadRequest initializeFileBlocksDownloadRequest = new()
   {
         Target = entityReference,
         FileAttributeName = attributeName
   };

   var initializeFileBlocksDownloadResponse =
         (InitializeFileBlocksDownloadResponse)service.Execute(initializeFileBlocksDownloadRequest);

   string fileContinuationToken = initializeFileBlocksDownloadResponse.FileContinuationToken;
   long fileSizeInBytes = initializeFileBlocksDownloadResponse.FileSizeInBytes;

   List<byte> fileBytes = new((int)fileSizeInBytes);

   long offset = 0;
   // If chunking is not supported, chunk size will be full size of the file.
   long blockSizeDownload = !initializeFileBlocksDownloadResponse.IsChunkingSupported ? fileSizeInBytes :  4 * 1024 * 1024;

   // File size may be smaller than defined block size
   if (fileSizeInBytes < blockSizeDownload)
   {
         blockSizeDownload = fileSizeInBytes;
   }

   while (fileSizeInBytes > 0)
   {
         // Prepare the request
         DownloadBlockRequest downLoadBlockRequest = new()
         {
            BlockLength = blockSizeDownload,
            FileContinuationToken = fileContinuationToken,
            Offset = offset
         };

         // Send the request
         var downloadBlockResponse =
                  (DownloadBlockResponse)service.Execute(downLoadBlockRequest);

         // Add the block returned to the list
         fileBytes.AddRange(downloadBlockResponse.Data);

         // Subtract the amount downloaded,
         // which may make fileSizeInBytes < 0 and indicate
         // no further blocks to download
         fileSizeInBytes -= (int)blockSizeDownload;
         // Increment the offset to start at the beginning of the next block.
         offset += blockSizeDownload;
   }

   return fileBytes.ToArray();
}

Pour plus d’informations :

Télécharger un fichier dans une seule requête en utilisant l’API Web

L’exemple suivant télécharge un fichier texte nommé 4094kb.txt à partir de la colonne de fichier nommée sample_filecolumn de la table account pour un enregistrement avec accountid égal à <accountid>.

Demande :

GET [Organization Uri]/api/data/v9.2/accounts(<accountid>)/sample_filecolumn/$value HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json

Réponse :

La réponse comprend les en-têtes suivants.

En-tête Description
x-ms-file-size Taille du fichier en octets.
x-ms-file-name Le nom du fichier.
mimetype Le type MIME du fichier.
Access-Control-Expose-Headers Indique que les valeurs d'en-tête x-ms-file-size, x-ms-file-name, et mimetype sont disponibles pour les scripts qui s'exécutent dans le navigateur, en réponse à une demande d’origine croisée.
HTTP/1.1 200 OK
x-ms-file-size: 4191273
x-ms-file-name: 4094kb.txt
mimetype: text/plain
Access-Control-Expose-Headers: x-ms-file-size; x-ms-file-name; mimetype

< byte[] content removed for brevity. >

Télécharger le fichier en blocs à l’aide de l’API web

Note

L’exemple suivant fonctionne quand IsChunkingSupported est défini sur vrai. S’il est faux, utilisez Télécharger un fichier dans une seule requête à l’aide de l’API web.

Pour télécharger votre fichier en blocs à l’aide de l’API web, utilisez l’ensemble de requêtes suivant.

L’exemple suivant télécharge un fichier PDF nommé 25mb.pdf dans la colonne de fichier nommée sample_filecolumn de la table account pour un enregistrement avec accountid égal à <accountid>.

Demande :

Utilisez l’en-tête Range pour spécifier le nombre d’octets à retourner à l’aide de ce format :
<unit>=<range-start>-<range-end>
unit est en octets et range-start pour la première requête est 0.

Vous ne savez pas combien d’itérations sont requises pour télécharger l’intégralité du fichier jusqu’à obtenir la première réponse où l’en-tête x-ms-file-size de réponse vous indique la taille du fichier.

Lorsque la valeur <range-start> est inférieure à la taille totale du fichier, pour chaque requête ultérieure, incrémentez les valeurs <range-start> et <range-end> pour demander le bloc suivant du fichier.

GET [Organization Uri]/api/data/v9.2/accounts(<accountid>)/sample_filecolumn/$value HTTP/1.1
Range: bytes=0-4194303
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json

Réponse :

La réponse comprend les en-têtes suivants :

En-tête Description
x-ms-file-size Taille du fichier en octets.
x-ms-file-name Le nom du fichier.
x-ms-chunk-size Fournit une taille de bloc recommandée en octets.
mimetype Le type MIME du fichier.
Access-Control-Expose-Headers Indique que les valeurs d’en-tête x-ms-file-size, x-ms-file-name, x-ms-chunk-size et mimetype doivent être disponibles pour les scripts s’exécutant dans le navigateur, en réponse à une requête inter-origine.
HTTP/1.1 206 PartialContent
x-ms-file-size: 25870370
x-ms-file-name: 25mb.pdf
x-ms-chunk-size: 4194304
mimetype: application/pdf
Access-Control-Expose-Headers: x-ms-file-size; x-ms-file-name; x-ms-chunk-size; mimetype
OData-Version: 4.0

< byte[] content removed for brevity. >

Supprimer les fichiers

Vous pouvez supprimer des fichiers dans une colonne de fichier à l’aide de l’une des méthodes suivantes :

  • Utilisez le message Dataverse DeleteFile , qui est disponible à la fois pour le Kit de développement logiciel (SDK) et l’API web.
  • Envoyez une requête DELETE à l’aide de l’API web à la colonne de fichier de l’enregistrement.

Utiliser le message DeleteFile

En utilisant l’identificateur unique retourné par CommitFileBlocksUploadResponse.FileId ou récupéré à partir de la colonne, comme décrit dans Comportement lors de la récupération, vous pouvez supprimer le fichier en utilisant le message DeleteFile.

Utilisez une fonction comme l’exemple suivant pour supprimer un fichier à l’aide de l’identificateur unique et de la classe DeleteFileRequest.

static Guid DeleteFile(IOrganizationService service, Guid fileId)
{
   DeleteFileRequest deleteFileRequest = new()
   {
      FileId = fileId
   };
   service.Execute(deleteFileRequest);
}

Envoyer la requête DELETE à la colonne de fichier

À l’aide de l’API web, vous pouvez supprimer un fichier en envoyant une DELETE demande à l’emplacement de la ressource de fichier.

L’exemple suivant supprime des données de fichier d’une colonne nommée sample_filecolumn de la table account pour un enregistrement avec accountid égal à <accountid>.

Demande :

DELETE [Organization Uri]/api/data/v9.2/accounts(<accountid>)/sample_filecolumn HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json

Réponse :

HTTP/1.1 204 NoContent
OData-Version: 4.0

Pour plus d’informations : Supprimer une valeur de propriété unique

Voir également

Vue d’ensemble des fichiers et des images
Types de données de colonne > Colonnes de fichier
Travailler avec des définitions de colonnes de fichiers en utilisant du code
Exemple : opérations de fichier en utilisant le SDK Dataverse pour .NET
Exemple : Opérations de fichier à l’aide de l’API web Dataverse.