Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dateispalten in Microsoft Dataverse unterscheiden sich von anderen Systemspalten, die Binärdaten speichern, da Sie die Werte in einem Erstellungs- oder Aktualisierungsvorgang nicht direkt festlegen oder die Dateidaten mit dem Datensatz abrufen können. Zum Erstellen, Abrufen, Aktualisieren oder Löschen von Binärdaten für Dateispalten verwenden Sie die in diesem Artikel beschriebenen Methoden. Erfahren Sie, wie Sie Dateien mithilfe des SDK für .NET und der Web-API hochladen, herunterladen und löschen, einschließlich Unterstützung für blockierte Übertragungen großer Dateien.
Sie können mit Dateispaltendaten arbeiten, indem Sie verschiedene Methoden über die Web-API verwenden. Alle Methoden werden gleichermaßen unterstützt. Wählen Sie daher die Methode aus, die für Sie am besten geeignet ist. Da Binärdateien möglicherweise groß sind, müssen Sie die Datei häufig in mehrere Blöcke (oder Blöcke) aufteilen, die Sie sequenziell oder parallel senden oder empfangen 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, jedoch mit angehängtem _Name. Wenn der Schemaname sample_FileColumn ist, ist die unterstützende Zeichenfolgenspalte sample_FileColumn_Name. Der logische Name für die unterstützende Spalte lautet sample_filecolumn_name.
Anmerkung
Die Spalte "Dateiname" wird im Power Apps-Designer nicht angezeigt.
Beziehung zur FileAttachment-Tabelle
Wenn Sie eine Dateispalte für eine Tabelle erstellen, erstellen Sie auch eine neue eins-zu-viele-Beziehung zwischen dieser Tabelle und der FileAttachment-Tabelle. Der Name der Beziehung lautet {table logical name}_FileAttachments. Wenn die Dateispalte beispielsweise Teil der Kontotabelle ist, lautet account_FileAttachmentsder Beziehungsname .
Sie können diese Beziehung verwenden, um weitere Daten über die Dateispalte und alle anderen Dateispalten für die Tabelle zurückzugeben. Weitere Informationen finden Sie unter Abrufen zusätzlicher Informationen zu Dateien für einen Datensatz.
Verhalten beim Abrufen
Wenn Sie einen Datensatz abrufen und eine Dateispalte einschließen, ist der zurückgegebene Wert ein eindeutiger Bezeichner für die Datei. Sie können diesen Wert verwenden, um die Datei mithilfe der DeleteFile Nachricht zu löschen. Diese ID dient ausschließlich dazu, zu überprüfen, ob die Spalte einen Wert aufweist. Weitere Informationen finden Sie unter Verwenden der DeleteFile-Nachricht.
Die folgenden Beispiele zeigen, was Sie beim Abrufen von Daten aus Dateispalten wie bei anderen Spalten erwarten können.
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:
Abrufen zusätzlicher Informationen zu Dateien für einen Datensatz
Sie können die Beziehung zwischen der Dateispaltentabelle und der FileAttachment Tabelle verwenden, um Informationen zu allen Dateispalten zurückzugeben, die dieser Tabellenzeile zugeordnet sind.
Die statische RetrieveAccountRecordWithFileData-Methode zeigt, wie Informationen zu allen Dateispalten zurückgegeben werden, die Daten enthalten, die sich auf den account-Datensatz mit dem übereinstimmenden accountid-Wert 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
Sie können Dateien auf drei verschiedene Arten in eine Dateispalte hochladen:
- Dataverse-Meldungen verwenden, die sowohl für das SDK als auch für die Web-API verfügbar sind
- Hochladen einer Datei in einer einzigen Anforderung mithilfe der Web-API
- Hochladen der Datei in Blöcken mithilfe der Web-API
Anmerkung
- Überprüfen Sie, ob die maximale Spaltendateigröße groß genug ist, um die Datei zu akzeptieren, die Sie hochladen. Weitere Informationen finden Sie unter "Überprüfen der maximalen Dateigröße".
- Sie können diese APIs auch verwenden, um Bildspaltendaten hochzuladen. Weitere Informationen finden Sie unter Verwenden von Bildspaltendaten.
Dataverse-Nachrichten zum Hochladen einer Datei verwenden
Sie können Dataverse-Nachrichten mithilfe des SDK für .NET oder Web-API verwenden. Wenn eine Datei auf diese Weise hochgeladen wird, muss ein Satz von drei Nachrichten verwendet werden:
| Nachricht | Beschreibung |
|---|---|
InitializeFileBlocksUpload |
Verwenden Sie diese Nachricht, um die Spalte anzugeben, in die Sie eine Datei hochladen möchten. Es gibt ein Dateifortsetzungstoken aus, das Sie verwenden können, um die Datei in Blöcken mit der UploadBlock-Nachricht und CommitFileBlocksUpload hochzuladen. |
UploadBlock |
Teilen Sie Ihre Datei in Blöcke auf, und generieren Sie für jeden Block eine blockid. Senden Sie dann mehrere Anfragen, bis alle Blöcke zusammen mit dem Fortsetzungstoken der Datei gesendet werden. |
CommitFileBlocksUpload |
Nachdem Sie Anforderungen für alle Blöcke mithilfe von UploadBlock gesendet haben, verwenden Sie diese Nachricht, um den Uploadvorgang durch Senden abzuschließen.- Die Liste der generierten Blockids - Der Name der Datei - Der MIME-Typ der Datei - Datei-Fortsetzungstoken |
Verwenden Sie zum Hochladen einer Datei oder eines Bilds eine Funktion wie die folgende, die die Klassen InitializeFileBlocksUploadRequest, UploadBlockRequest und CommitFileBlocksUploadRequest verwendet.
/// <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:
Anmerkung
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.
Hochladen einer Datei in einer einzigen Anforderung mithilfe der Web-API
Wenn die Größe der Datei kleiner als 128 MB ist, können Sie die Datei in einer einzigen Anforderung mithilfe der Web-API hochladen.
Im folgenden Beispiel wird eine Textdatei mit dem Namen 4094kb.txt in die Dateispalte mit dem Namen sample_filecolumn der account-Tabelle für einen Datensatz hochgeladen, bei dem accountid<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-Funktion Set-FileColumn veranschaulicht das Hochladen einer Datei in einer einzelnen Anforderung mithilfe der Web-API.
Weitere Informationen zur Verwendung von PowerShell und Visual Studio Code mit der Dataverse-Web-API finden Sie unter:
- 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 globalen $baseURI und $baseHeaders setzt. Legen Sie diese Werte mithilfe der Connect in "Create a Connect"-Funktion beschriebenen Funktion fest.
<#
.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
}
Hochladen der Datei in Blöcken mithilfe der Web-API
Wenn Sie Ihre Datei in Blöcken mithilfe der Web-API hochladen möchten, verwenden Sie die folgenden Anforderungen.
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 hochgeladen, bei dem accountid gleich <accountid> ist.
Anforderung:
Die erste Anforderung muss diesen Header enthalten: x-ms-transfer-mode: chunked.
Legen Sie den Dateinamen mithilfe des x-ms-file-name Abfrageparameters 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
Anmerkung
Sie können den Dateinamen auch als x-ms-file-name Anforderungsheader einschließen, aber dieser Ansatz unterstützt keine Dateinamen außerhalb des ASCII-Zeichensatzes. Wenn Sie den Header verwenden, hat sie 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 von ihm gesendeten Anforderungen Teil desselben Vorgangs sind.
Die Antwort enthält die folgenden Header.
| Kopfzeile | Beschreibung |
|---|---|
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:
| Kopfzeile | Beschreibung |
|---|---|
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.Jede nachfolgende Anforderung erhöht diesen Wert, bis die gesamte Datei gesendet wird: bytes 4194304-8388607/25870370bytes 8388608-12582911/25870370bytes 12582912-16777215/25870370bytes 16777216-20971519/25870370bytes 20971520-25165823/25870370bytes 25165824-25870369/25870370 |
| Inhaltslänge | Gibt die Größe der Nachricht an. Im vorherigen Beispiel ist der Wert für die letzte Anforderung 704546 und nicht 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 Teilinhalte enthält, lautet die Antwort 206 PartialContent.
Antwort:
HTTP/1.1 206 PartialContent
OData-Version: 4.0
Für die endgültige 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 unter Verwendung der Connect in Create a Connect-Funktion beschriebenen Funktion festlegt.
<#
.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
Überprüfen Sie vor dem Hochladen einer Datei, ob die Größe der Datei die in der Eigenschaft gespeicherte MaxSizeInKB überschreitet.
Wenn Sie versuchen, eine datei hochzuladen, die zu groß ist, wird die folgende Fehlermeldung angezeigt:
Name:
unManagedidsattachmentinvalidfilesize
Code:0x80044a02
Nummer:-2147202558
Meldung:Attachment file size is too big.
Verwenden Sie die folgenden Beispiele, 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:
Herunterladen von Dateien
Sie können drei verschiedene Methoden verwenden, um Dateien aus einer Dateispalte herunterzuladen:
- Dataverse-Meldungen verwenden, die sowohl für das SDK als auch für die Web-API verfügbar sind
- Herunterladen einer Datei in einer einzigen Anforderung mithilfe der Web-API
- Herunterladen der Datei in Blöcken mithilfe der Web-API
Anmerkung
Sie können diese Methoden auch verwenden, um Bildspalten herunterzuladen, aber es gibt einige Unterschiede. Weitere Informationen finden Sie unter "Bilder herunterladen".
Bei lokalen Umgebungen oder wenn eine Umgebung einen selbstverwalteten Schlüssel (BYOK) verwendet, befindet sich die Datei nicht im Dateispeicher. Wenn sich eine Datei nicht im Dateispeicher befindet, wird das Herunterladen in mehreren Blöcken nicht unterstützt. Die InitializeFileBlocksDownloadResponse ComplexType - und InitializeFileBlocksDownloadResponse-Klasse weisen eine IsChunkingSupported Eigenschaft auf, die angibt, ob die Datei in mehreren Blöcken heruntergeladen werden kann oder nicht. Wenn das Chunking nicht unterstützt wird, wird der BlockLength Wert auf die Dateigröße festgelegt.
Beim Versuch, einen Abschnitt herunterzuladen, wenn IsChunkingSupported auf "False" gesetzt ist, tritt dieser Fehler auf.
Name: UploadingAndDownloadingInMultipleChunksNotSupported
Code: 0x80090017
Meldung: Downloading in multiple chunks isn't supported for the files stored in the database.
Dataverse-Nachrichten zum Herunterladen einer Datei verwenden
Sie können Dataverse-Nachrichten mithilfe des SDK für .NET oder Web-API verwenden. Wenn eine Datei auf diese Weise heruntergeladen wird, muss ein Nachrichtenpaar verwendet werden:
| Nachricht | Beschreibung |
|---|---|
InitializeFileBlocksDownload |
Verwenden Sie diese Nachricht, um die Spalte anzugeben, aus der Sie eine Datei herunterladen möchten. Sie gibt die Dateigröße in Byte und ein Dateifortsetzungstoken zurück, mit dem Sie die Datei mithilfe der DownloadBlock Nachricht in Blöcken 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 gesamte heruntergeladene Datei zu erstellen.
Sie können eine Funktion wie die folgende verwenden, um eine Datei oder ein Bild herunterzuladen, indem Sie das SDK und die Klassen InitializeFileBlocksDownloadRequest und DownloadBlockRequest verwenden.
/// <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 einer einzelnen Anforderung mithilfe der 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 dem accountid heruntergeladen, das <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.
| Kopfzeile | 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 | Gibt an, dass die Headerwerte x-ms-file-size, x-ms-file-name und mimetype für Skripts verfügbar sind, die im Browser ausgeführt werden, als Antwort auf eine ursprungsübergreifende Anfrage. |
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. >
Herunterladen der Datei in Blöcken mithilfe der Web-API
Anmerkung
Das folgende Beispiel funktioniert, wenn IsChunkingSupported auf "true" festgelegt ist. Wenn es falsch ist, verwenden Sie , um eine Datei mit einer einzigen Anfrage mithilfe der Web-API herunterzuladen.
Wenn Sie Ihre Datei in Blöcken mithilfe der Web-API herunterladen möchten, verwenden Sie die folgenden Anforderungen.
Im folgenden Beispiel wird eine PDF-Datei mit dem Namen 25mb.pdf in die Spalte für Dateien mit dem Namen sample_filecolumn in der Tabelle account für einen Datensatz heruntergeladen, bei dem accountid gleich <accountid> ist.
Anforderung:
Verwenden Sie den Range-Header, um die Anzahl der Bytes anzugeben, die mit diesem Format zurückgegeben werden sollen:
<unit>=<range-start>-<range-end>
Hierbei beträgt unit Bytes und range-start für die erste Anforderung 0.
Sie wissen nicht, wie viele Iterationen erforderlich sind, um die gesamte Datei herunterzuladen, bis Sie die erste Antwort erhalten, in der der x-ms-file-size Antwortheader Ihnen die Größe der Datei mitgeteilt.
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:
| Kopfzeile | 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 | Gibt an, dass die Headerwerte x-ms-file-size, x-ms-file-name, x-ms-chunk-size und mimetype für Skripte verfügbar sein sollen, die im Browser ausgeführt werden, als Reaktion auf eine Cross-Origin-Anfrage. |
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
Sie können Dateien in einer Dateispalte mithilfe einer der folgenden Methoden löschen:
- Verwenden Sie die Dataverse-Nachricht
DeleteFile, die sowohl für das SDK als auch für die Web-API verfügbar ist. - Senden Sie eine DELETE-Anforderung mithilfe der Web-API an die Dateispalte des Datensatzes.
Die DeleteFile-Nachricht verwenden
Mithilfe des eindeutigen Bezeichners, der entweder von CommitFileBlocksUploadResponse.FileId zurückgegeben oder aus der Spalte abgerufen wird, wie im Verhalten beim Abrufen beschrieben, können Sie die Datei löschen, indem Sie die DeleteFile-Nachricht verwenden.
Verwenden Sie eine Funktion wie das folgende Beispiel, um eine Datei mithilfe des eindeutigen Bezeichners und 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
Mithilfe 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 bei einem Datensatz gelöscht, dessen accountid<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 mithilfe der Dataverse-Web-API.