Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
- Vérifiez si la taille maximale de la colonne est suffisamment grande pour accepter le fichier que vous chargez. Pour plus d’informations, consultez Vérifier la taille maximale du fichier.
- Vous pouvez également utiliser ces API pour charger des données de colonnes d’images. Pour plus d’informations, consultez Utiliser les données de colonne d’image.
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 :
- Démarrage rapide : API web avec PowerShell et Visual Studio Code
- Utiliser PowerShell et Visual Studio Code avec l’API web Dataverse
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/25870370bytes 8388608-12582911/25870370bytes 12582912-16777215/25870370bytes 16777216-20971519/25870370bytes 20971520-25165823/25870370bytes 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>
Où 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.