Dateispaltendaten verwenden
Dateispalten unterscheiden sich von den anderen Systemspalten, die Binärdaten speichern können, da Sie die Werte weder direkt in einem Erstellungs- oder Aktualisierungsvorgang festlegen noch die Dateidaten mit dem Datensatz abrufen können. Sie müssen die in diesem Artikel beschriebenen Methoden verwenden, um Binärdaten für Dateispalten zu erstellen, abzurufen, zu aktualisieren oder zu löschen.
Es gibt verschiedene Möglichkeiten, mit Dateispaltendaten über die Web-API zu arbeiten. Alle Methoden werden gleichermaßen unterstützt. Wählen Sie die Methode aus, die für Sie am besten geeignet ist. Da Binärdateien groß sein können, ist es häufig erforderlich, die Datei in mehrere Abschnitte (oder Blöcke) aufzuteilen, die nacheinander oder parallel gesendet oder empfangen werden können, um die Leistung zu verbessern.
Dateinamenspalte
Jede Dateispalte verfügt über eine unterstützende schreibgeschützte Zeichenfolgenspalte, die den Namen der Datei enthält. Der Schemaname für diese Spalte hat denselben Namen wie die Dateispalte, es ist jedoch _Name
daran angehängt. Wenn der Schemaname also sample_FileColumn
lautet, lautet die unterstützende Zeichenfolgenspalte sample_FileColumn_Name
. Der logische Name für die unterstützende Spalte lautet sample_filecolumn_name
.
Hinweis
Die Dateinamenspalte wird im Power Apps-Designer nicht angezeigt.
Beziehung zur FileAttachment-Tabelle
Wenn eine Dateispalte für eine Tabelle erstellt wird, wird eine neue 1:n-Beziehung zwischen der Tabelle und der FileAttachment
-Tabelle erstellt. Der Name der Beziehung lautet {table logical name}_FileAttachments
. Wenn die Dateispalte beispielsweise Teil der Kontotabelle ist, lautet der Beziehungsname account_FileAttachments
.
Sie können diese Beziehung verwenden, um weitere Daten über die Dateispalte und alle anderen Dateispalten für die Tabelle zurückzugeben. Weitere Informationen: Zusätzliche Informationen zu Dateien für einen Datensatz abrufen.
Verhalten beim Abrufen
Wenn Sie einen Datensatz abrufen und eine Dateispalte einbeziehen, ist der zurückgegebene Wert ein eindeutiger Bezeichner für die Datei. Sie können diesen Wert verwenden, um die Datei mit der Meldung DeleteFile
zu löschen. Diese ID dient ausschließlich dazu, zu überprüfen, ob die Spalte einen Wert aufweist. Weitere Informationen: DeleteFile-Meldung verwenden.
Die folgenden Beispiele zeigen, was Sie erwarten können, wenn Sie Daten aus Dateispalten wie bei anderen Spalten abrufen.
Bei diesen Beispiele werden die Spalten name
, sample_filecolumn
und sample_filecolumn_name
für einen Kontodatensatz abgerufen:
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"]}");
}
Ausgabe:
name: Contoso Ltd.
sample_filecolumn: <file id>
sample_filecolumn_name: 25mb.pdf
Weitere Informationen:
Zusätzliche Informationen zu Dateien für einen Datensatz abrufen
Sie können die Beziehung zwischen der Dateispaltentabelle und der FileAttachment
-Tabelle verwenden, um Informationen über alle Dateispalten zurückzugeben, die dieser Tabellenzeile zugeordnet sind.
Die statische RetrieveAccountRecordWithFileData
-Methode unten zeigt, wie Informationen zu allen Dateispalten zurückgegeben werden, die Daten enthalten, die sich auf den account
-Datensatz des übereinstimmenden accountid
-Werts beziehen.
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"]}");
});
}
Ausgabe:
In diesem Fall gibt es eine einzelne Dateispalte in der Kontentabelle mit dem Namen sample_filecolumn
, und dies sind die Daten zu der in dieser Spalte gespeicherten Datei.
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
Weitere Informationen:
Dateien hochladen
Es gibt drei verschiedene Möglichkeiten, Dateien in eine Dateispalte hochzuladen:
- Dataverse-Meldungen verwenden, die sowohl für das SDK als auch für die Web-API verfügbar sind
- Eine Datei in eine einzelne Anforderungen über die Web-API hochladen
- Die Datei in Blöcken über die Web-API hochladen
Hinweis
- Sie sollten überprüfen, ob die maximale Dateigröße für Spalten groß genug ist, damit die Datei akzeptiert wird, die Sie hochladen. Weitere Informationen: Maximale Dateigröße überprüfen
- Sie können diese APIs auch verwenden, um Bildspaltendaten hochzuladen. Weitere Informationen: Bildspaltendaten verwenden
Dataverse-Nachrichten zum Hochladen einer Datei verwenden
Sie können Dataverse-Nachrichten über das SDK für .NET oder die Web-API verwenden. Wenn eine Datei auf diese Weise hochgeladen wird, muss ein Satz von drei Nachrichten verwendet werden:
Nachricht | Beschreibung des Dataflows |
---|---|
InitializeFileBlocksUpload |
Verwenden Sie diese Nachricht, um die Spalte anzugeben, in die Sie eine Datei hochladen möchten. Es wird ein Dateifortsetzungstoken zurückgegeben, mit dem Sie die Datei blockweise über die UploadBlock -Nachricht und mit CommitFileBlocksUpload hochladen können. |
UploadBlock |
Teilen Sie Ihre Datei in Blöcke auf, und generieren Sie für jeden Block eine blockid. Senden Sie dann mehrere Anforderungen, bis alle Blöcke zusammen mit dem Dateifortsetzungstoken gesendet wurden. |
CommitFileBlocksUpload |
Nachdem Sie Anforderungen für alle Blöcke mit UploadBlock gesendet haben, verwenden Sie diese Nachricht, um den Upload-Vorgang zu bestätigen, indem Sie Folgendes senden:- Die Liste der generierten Blockids - Der Name der Datei - Der MIME-Typ der Datei - Partitionsfortsetzungstoken |
Sie können eine Funktion wie die folgende verwenden, um eine Datei oder ein Bild mit den Klassen InitializeFileBlocksUploadRequest, UploadBlockRequest und CommitFileBlocksUploadRequest hochzuladen.
/// <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;
}
Weitere Informationen:
Hinweis
Diese Beispielmethode enthält eine Logik, mit der versucht wird, den MIME Typ der Datei mit Hilfe der Methode FileExtensionContentTypeProvider.TryGetContentType(String, String) zu ermitteln, wenn er nicht bereitgestellt wird. Wenn der Typ nicht gefunden wird, wird er auf application/octet-stream
gesetzt.
Eine Datei in eine einzelne Anforderungen über die Web-API hochladen
Wenn die Dateigrößer weniger als 128 MB beträgt, können Sie sie in einer einzelnen Anforderung die Web-API hochladen.
Im folgenden Beispiel wird eine Textdatei mit dem Namen 4094kb.txt
in die Dateispalte mit dem Namen sample_filecolumn
in der account
-Tabelle für einen Datensatz mit der accountid
hochgeladen, die <accountid>
entspricht.
Anforderung:
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>
Antwort:
HTTP/1.1 204 NoContent
OData-Version: 4.0
PowerShell-Beispiel zum Hochladen einer Datei in einer einzigen Anforderung
Die folgende PowerShell-Set-FileColumn
-Funktion zeigt, wie eine Datei mithilfe der Web-API in einer einzigen Anforderung hochgeladen wird.
Erfahren Sie mehr über die Verwendung von PowerShell und Visual Studio Code mit der Dataverse-Web-API:
- Schnellstart-Web-API mit PowerShell und Visual Studio Code
- PowerShell und Visual Studio Code in der Dataverse-Web-API verwenden
Diese Funktion erfordert eine Verbindung, die die globale $baseURI
und $baseHeaders
festlegt, die mit der Connect
-Funktion beschrieben in Funktion „Verbinden“ erstellen festgelegt werden.
<#
.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
}
Die Datei in Blöcken über die Web-API hochladen
Verwenden Sie den folgenden Satz von Anforderungen, um Ihre Datei in Blöcken über die Web-API hochzuladen.
Im folgenden Beispiel wird eine PDF-Datei mit dem Namen 25mb.pdf
in die Dateispalte mit dem Namen sample_filecolumn
in der account
-Tabelle für einen Datensatz mit der accountid
hochgeladen, die <accountid>
entspricht.
Anforderung:
Die erste Anforderung muss den folgenden Header enthalten: x-ms-transfer-mode: chunked
.
Legen Sie den Dateinamen mit dem x-ms-file-name
-Abfrageparameter fest.
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
Hinweis
Der Dateiname kann auch als x-ms-file-name
-Anforderungsheader eingeschlossen werden, aber dies unterstützt keine Dateinamen außerhalb des ASCII-Zeichensatzes. Wenn der Header verwendet wird, hat er Vorrang vor dem x-ms-file-name
-Abfrageparameter.
Antwort:
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
Der Location-Header der Antwort enthält eine URL, die in nachfolgenden Anforderungen verwendet werden soll. Er enthält einen sessiontoken
-Abfrageparameter, der angibt, dass alle damit gesendeten Anforderungen Teil desselben Vorgangs sind.
Die Antwort enthält die folgenden Header.
Header | Beschreibung des Dataflows |
---|---|
x-ms-chunk-size |
Stellt eine empfohlene Blockgröße in Bytes bereit. |
Accept-Ranges | Gibt an, dass der Server Teilanforderungen des Clients für Dateidownloads unterstützt. Der Wert bytes gibt an, dass der Bereichswert in nachfolgenden Anforderungen in Bytes angegeben werden sollte. |
Access-Control-Expose-Headers | Zeigt an, dass der x-ms-chunk-size -Header-Wert als Antwort auf eine Cross-Origin-Anforderung Skripten zur Verfügung gestellt werden sollte, die im Browser ausgeführt werden. |
Anforderung:
Nachfolgende Anforderungen sollten den Wert des Location
-Headers verwenden, der von der ersten Anforderung zurückgegeben wird, sodass der sessiontoken
-Wert enthalten ist.
Jede Anforderung muss diesen Teil der Datei im Textkörper sowie die folgenden Header enthalten:
Header | Beschreibung des Dataflows |
---|---|
x-ms-file-name |
Der Name der Datei. |
Inhaltsart | Auf application/octet-stream festlegen |
Content-Range | Bei Verwendung dieses Formats: <unit> <range-start>-<range-end>/<size> Der Wert der ersten Anforderung: bytes 0-4194303/25870370 gibt an, dass die Messung Bytes verwendet. Diese Anfrage umfasst die ersten 4194303 Bytes einer Datei, deren Größe 25870370 Bytes (fast 25 MB) beträgt.Bei jeder nachfolgenden Anforderung wird dieser Wert erhöht, bis die gesamte Datei gesendet wurde: bytes 4194304-8388607/25870370 bytes 8388608-12582911/25870370 bytes 12582912-16777215/25870370 bytes 16777216-20971519/25870370 bytes 20971520-25165823/25870370 bytes 25165824-25870369/25870370 |
Inhaltslänge | Gibt die Größe der Nachricht an. Im Beispiel oben lautet dieser Wert für die letzte Anforderung 704546 statt 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>
Für jede Anforderung, die einen Teilinhalt enthält, lautet die Antwort 206 PartialContent.
Antwort:
HTTP/1.1 206 PartialContent
OData-Version: 4.0
Für die letzte Anforderung, die den letzten Teil der Datei enthält, lautet die Antwort 204 NoContent.
Antwort:
HTTP/1.1 204 NoContent
OData-Version: 4.0
PowerShell-Beispiel zum Hochladen einer Datei in Blöcken
Die folgende PowerShell-Set-FileColumnInChunks
-Funktion zeigt, wie eine Datei mithilfe der Web-API in Blöcken hochgeladen wird. Diese Funktion erfordert eine Verbindung, die die globale $baseURI
und $baseHeaders
festlegt, die mit der Connect
-Funktion beschrieben in Funktion „Verbinden“ erstellen festgelegt werden.
<#
.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
}
}
Maximale Dateigröße überprüfen
Bevor Sie eine Datei hochladen, können Sie überprüfen, ob die Größe der Datei die konfigurierte maximale Dateigröße, die in der MaxSizeInKB
-Eigenschaft gespeichert ist, überschreitet.
Wenn Sie versuchen, eine zu große Datei hochzuladen, erhalten Sie die folgende Fehlermeldung:
Name:
unManagedidsattachmentinvalidfilesize
Code:0x80044a02
Nummer:-2147202558
Meldung:Attachment file size is too big.
Sie können die folgenden Beispiele verwenden, um die maximale Dateigröße zu überprüfen:
Die statische GetFileColumnMaxSizeInKb
-Methode gibt den MaxSizeInKB
-Wert für eine Dateispalte zurück.
/// <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.");
}
}
Weitere Informationen:
Dateien herunterladen
Es gibt drei verschiedene Methoden, Dateien von einer Dateispalte hochzuladen:
- Dataverse-Meldungen verwenden, die sowohl für das SDK als auch für die Web-API verfügbar sind
- Eine Datei in eine einzelne Anforderungen über die Web-API herunterladen
- Die Datei in Blöcken über die Web-API herunterladen
Hinweis
Diese Methoden können auch zum Herunterladen von Bildspalten verwendet werden, es gibt jedoch einige Unterschiede. Weitere Informationen: Bilder herunterladen
Für lokale Umgebungen, oder wenn eine Umgebung den selbstverwalteten Schlüssel (BYOK) verwendet, befindet sich die Datei nicht im Dateispeicher. Wenn sich eine Datei nicht im Speicher befindet, wird das Herunterladen in mehreren Chunks nicht unterstützt. Der InitializeFileBlocksDownloadResponse ComplexType und InitializeFileBlocksDownloadResponse Class haben eine IsChunkingSupported
-Eigenschaft, die angibt, ob die Datei in mehreren Chunks heruntergeladen werden kann oder nicht. Wenn Chunking nicht unterstützt wird, dann legen Sie BlockLength
als Dateigröße fest.
Der Versuch, einen Teil eines Chunks herunterzuladen, wenn IsChunkingSupported auf false festgelegt ist, führt zu diesem Fehler:
Name: UploadingAndDownloadingInMultipleChunksNotSupported
Code: 0x80090017
Meldung: Downloading in multiple chunks is not supported for the files stored in the database.
Dataverse-Nachrichten zum Herunterladen einer Datei verwenden
Sie können Dataverse-Nachrichten über das SDK für .NET oder die Web-API verwenden. Wenn eine Datei auf diese Weise heruntergeladen wird, muss ein Nachrichtenpaar verwendet werden:
Nachricht | Beschreibung des Dataflows |
---|---|
InitializeFileBlocksDownload |
Verwenden Sie diese Nachricht, um die Spalte anzugeben, aus der Sie eine Datei herunterladen möchten. Sie gibt die Dateigröße in Bytes und ein file continuation token zurück, mit dem Sie die Datei blockweise über die DownloadBlock -Nachricht herunterladen können. |
DownloadBlock |
Fordern Sie die Größe des Blocks, den Offsetwert und das Dateifortsetzungstoken an. |
Nachdem Sie alle Blöcke heruntergeladen haben, müssen Sie sie verbinden, um die komplette heruntergeladene Datei zu erstellen.
Sie können eine Funktion wie die folgende verwenden, um eine Datei oder ein Bild über das SDK anhand der Klassen InitializeFileBlocksDownloadRequest und DownloadBlockRequest herunterzuladen.
/// <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();
}
Weitere Informationen:
Eine Datei in eine einzelne Anforderungen über die Web-API herunterladen
Im folgenden Beispiel wird eine Textdatei mit dem Namen 4094kb.txt
aus der Dateispalte mit dem Namen sample_filecolumn
in der account
-Tabelle für einen Datensatz mit der accountid
heruntergeladen, die <accountid>
entspricht.
Anforderung:
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
Antwort:
Die Antwort enthält die folgenden Header.
Header | Beschreibung |
---|---|
x-ms-file-size |
Die Größe der Datei in Bytes. |
x-ms-file-name |
Der Name der Datei. |
mimetype |
Der MIME-Typ der Datei |
Access-Control-Expose-Headers | Zeigt an, dass die Werte der Header x-ms-file-size , x-ms-file-name und mimetype als Antwort auf eine Cross-Origin-Anforderung Skripten zur Verfügung gestellt werden sollten, die im Browser ausgeführt werden. |
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. >
Die Datei in Blöcken über die Web-API herunterladen
Hinweis
Das folgende Beispiel bezieht sich auf Fälle, in denen IsChunkingSupported
auf wahr festgelegt ist. Wenn sie falsch ist, verwenden Sie bitte Download einer Datei in einem einzigen Request über Web-API.
Verwenden Sie den folgenden Satz von Anforderungen, um Ihre Datei in Blöcken über die Web-API herunterzuladen.
Im folgenden Beispiel wird eine PDF-Datei mit dem Namen 25mb.pdf
in die Dateispalte mit dem Namen sample_filecolumn
in der account
-Tabelle für einen Datensatz mit der accountid
heruntegeladen, die <accountid>
entspricht.
Anforderung:
Verwenden Sie den Header Bereich, um die Anzahl der zurückzugebenden Bytes in diesem Format anzugeben:
<unit>=<range-start>-<range-end>
Hierbei beträgt unit
Bytes und range-start
für die erste Anforderungrage 0
.
Sie wissen erst, wie viele Iterationen erforderlich sind, um die gesamte Datei herunterzuladen, wenn Sie die erste Antwort erhalten, deren x-ms-file-size
-Antwortheader die Größe der Datei angibt.
Während <range-start>
kleiner als die Gesamtgröße der Datei ist, werden für jede nachfolgende Anforderung die Werte <range-start>
und <range-end>
erhöht, um den nächsten Block der Datei anzufordern.
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
Antwort:
Die Antwort enthält die folgenden Header:
Header | Beschreibung |
---|---|
x-ms-file-size |
Die Größe der Datei in Bytes. |
x-ms-file-name |
Der Name der Datei. |
x-ms-chunk-size |
Stellt eine empfohlene Blockgröße in Bytes bereit. |
mimetype |
Der MIME-Typ der Datei |
Access-Control-Expose-Headers | Zeigt an, dass die Werte der Header x-ms-file-size , x-ms-file-name , x-ms-chunk-size und mimetype als Antwort auf eine Cross-Origin-Anforderung Skripten zur Verfügung gestellt werden sollten, die im Browser ausgeführt werden. |
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. >
Dateien löschen
Es gibt zwei verschiedene Möglichkeiten, Dateien in eine Dateispalte zu löschen:
- Die Dataverse
DeleteFile
-Nachricht verwenden, die sowohl für das SDK als auch für die Web-API verfügbar ist - Senden Sie eine DELETE-Anforderung über die Web-API an die Dateispalte des Datensatzes.
Die DeleteFile-Nachricht verwenden
Mithilfe des eindeutigen Bezeichners, der von CommitFileBlocksUploadResponse.FileId
zurückgegeben oder aus der Spalte abgerufen werden, wie in Verhalten beim Abrufen beschrieben, können Sie die Datei mit der DeleteFile
-Nachricht löschen.
Sie können eine Funktion wie die folgende verwenden, um eine Datei anhand des eindeutigen Bezeichners mit der DeleteFileRequest-Klasse zu löschen.
static Guid DeleteFile(IOrganizationService service, Guid fileId)
{
DeleteFileRequest deleteFileRequest = new()
{
FileId = fileId
};
service.Execute(deleteFileRequest);
}
DELETE-Anforderung an die Dateispalte senden
Mit der Web-API können Sie eine Datei löschen, indem Sie eine DELETE
-Anforderung an den Speicherort der Dateiressource senden.
Im folgenden Beispiel werden Dateidaten für eine Spalte mit dem Namen sample_filecolumn
in der account
-Tabelle für einen Datensatz mit der accountid
hochgeladen, die <accountid>
entspricht.
Anforderung:
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
Antwort:
HTTP/1.1 204 NoContent
OData-Version: 4.0
Weitere Informationen: Einzelnen Eigenschaftswert löschen
Siehe auch
Dateien und Bilder – Übersicht
Spaltendatentypen > Dateispalten
Mithilfe von Code mit Dateispaltendefinitionen arbeiten
Beispiel: Dateivorgänge über das Dataverse-SDK für .NET
Beispiel: Dateivorgänge über die Dataverse-API
Hinweis
Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)
Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).