Dateidaten mit Anlagen- und Notizdatensätzen verwenden
Anlagentabellen (ActivityMimeAttachment) und Notiztabellen (Anmerkungen) enthalten spezielle Zeichenfolgenspalten, in denen Dateidaten gespeichert werden. Diese Tabellen gab es schon vor den Datei- oder Bildspalten, daher funktionieren sie anders als diese Tabellen.
- Die binären Dateidaten werden als Base64-kodierte Zeichenfolgen in Zeichenfolgen-Spalten gespeichert. Anhänge werden in der Spalte
ActivityMimeAttachment.Body
und Notizen in der SpalteAnnotation.DocumentBody
gespeichert. - Dateinamendaten werden in der Spalte
FileName
gespeichert. - Die Daten des MIME-Typs werden in der Spalte
MimeType
gespeichert.
Da FileName
, MimeType
, ActivityMimeAttachment.Body
und Annotation.DocumentBody
Teil der Daten für den Anhang oder den Notiz-Datensatz sind, sollten Sie diese drei Spalten zusammen mit allen anderen Werten aktualisieren.
Sie können die Werte der Spalten activitymimeattachment.body
und annotation.documentbody
direkt als Base64-kodierte Zeichenfolgen abrufen und festlegen. Die Einstellung dieser Werte sollte in Ordnung sein, solange die Dateien nicht zu groß sind, z.B. unter 4 MB. Standardmäßig beträgt die maximale Größe 5 MB. Sie können diese Spalten so konfigurieren, dass sie Dateien bis zu einer Größe von 128 MB akzeptieren. Wenn Sie die maximale Dateigröße erhöht haben und mit größeren Dateien arbeiten, sollten Sie die bereitgestellten Meldungen verwenden, um die Dateien beim Hoch- oder Herunterladen in kleinere Teile aufzuteilen. Informationen zum Abrufen oder Ändern der Begrenzungen der Dateigröße finden Sie unter Begrenzungen der Dateigröße.
Anhänge
Ein Anhang ist eine Datei, die mit einer E-Mail-Aktivität verbunden ist, entweder direkt oder über eine E-Mail-Vorlage (Vorlage). Der Aktivität oder Vorlage können mehrere Anhänge zugeordnet werden. Sie können Anhangsdateien wiederverwenden, indem Sie den Wert activitymimeattachment.attachmentid
so einstellen, dass er auf einen anderen vorhandenen Anhang verweist, anstatt die Eigenschaften body
, filename
und mimetype
zu setzen.
Andere Dataverse Tabellen namens Anhang
Anhang (ActivityMimeAttachment) ist nicht zu verwechseln mit Activityfileattachment, das Dateien unterstützt, die mit der Tabelle Post verbunden sind.
Innerhalb des Schemas Dataverse gibt es auch eine öffentliche Tabelle mit dem Namen Attachment
, die in der Web-API als Anhang EntityType angezeigt wird. Diese Tabelle kann abgefragt werden und gibt Daten in der ActivityMimeAttachment
-Tabelle wieder. Sie unterstützt jedoch keine Erstellen-, Abrufen-, Aktualisieren- oder Löschenvorgänge. Diese Tabelle wird nicht im Power Apps Designer angezeigt.
Hochladen von Anhangsdateien
Verwenden Sie die InitializeAttachmentBlocksUpload
-, UploadBlock
- und CommitAttachmentBlocksUpload
-Meldungen, um große Dateien für Anlagen hochzuladen.
Wichtig
Sie können diese Nachrichten nur verwenden, um einen neuen Anhang zu erstellen. Wenn Sie versuchen, damit einen bestehenden Anhang zu aktualisieren, erhalten Sie eine Fehlermeldung, dass der Datensatz bereits existiert.
Die folgende statische UploadAttachment
-Methode zeigt, wie Sie einen Anhang mit einer Datei unter Verwendung der Klassen InitializeAttachmentBlocksUploadRequest, UploadBlockRequest und CommitAttachmentBlocksUploadRequest erstellen, um eine CommitAttachmentBlocksUploadResponse mit den Eigenschaften ActivityMimeAttachmentId
und FileSizeInBytes
zurückzugeben.
static CommitAttachmentBlocksUploadResponse UploadAttachment(
IOrganizationService service,
Entity attachment,
FileInfo fileInfo,
string fileMimeType = null)
{
if (attachment.LogicalName != "activitymimeattachment")
{
throw new ArgumentException(
"The attachment parameter must be an activitymimeattachment entity.",
nameof(attachment));
}
// body value in activitymimeattachment not needed. Remove if found.
if (attachment.Contains("body"))
{
attachment.Attributes.Remove("body");
}
// 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";
}
}
// Don't overwrite mimetype value if it exists
if (!attachment.Contains("mimetype"))
{
attachment["mimetype"] = fileMimeType;
}
// Initialize the upload
InitializeAttachmentBlocksUploadRequest initializeRequest = new()
{
Target = attachment
};
var initializeResponse =
(InitializeAttachmentBlocksUploadResponse)service.Execute(initializeRequest);
string fileContinuationToken = initializeResponse.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);
}
// Commit the upload
CommitAttachmentBlocksUploadRequest commitRequest = new()
{
BlockList = blockIds.ToArray(),
FileContinuationToken = fileContinuationToken,
Target = attachment
};
return (CommitAttachmentBlocksUploadResponse)service.Execute(commitRequest);
}
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.
Download von Anhangsdateien
Sie können eine Datei mit Anhängen in einem einzigen Vorgang über die Web-API oder in Stücken über das SDK oder die Web-API herunterladen.
Herunterladen von Anhangsdateien in einem einzigen Vorgang über die Web-API
Mithilfe der Web-API können Sie eine Anhangsdatei in einem einzigen Vorgang herunterladen.
Anders als beim Abrufen von Dateispalten liefert diese Methode keine Informationen über die Dateigröße, den Dateinamen oder den MIME Typ.
Anforderung:
GET [Organization Uri]/api/data/v9.2/activitymimeattachments(<activitymimeattachmentid>)/body/$value HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json
Antwort:
HTTP/1.1 200 OK
OData-Version: 4.0
Content-Type: text/plain
<Base64 string content removed for brevity>
Weitere Informationen:
- Eine Datei in eine einzelne Anforderungen über die Web-API herunterladen
- Den Rohwert einer Eigenschaft abrufen
Download von Anhangsdateien in Chunks
Um die Datei in Stücken abzurufen, verwenden Sie die folgenden Nachrichten entweder mit dem SDK oder der Web-API:
Nachricht | Beschreibung |
---|---|
InitializeAttachmentBlocksDownload |
Gibt den Datensatz der Notiz an, von dem 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 |
Fordert die Größe des Blocks, den Offset-Wert und das Dateifortsetzungs-Token an. |
Nachdem Sie alle Blöcke heruntergeladen haben, fügen Sie sie zusammen, um die gesamte heruntergeladene Datei zu erstellen.
Die folgende statische DownloadAttachment
-Methode zeigt, wie Sie eine Anlage mithilfe des SDK mit den Klassen InitializeAttachmentBlocksDownloadRequest und DownloadBlockRequest herunterladen. Diese Funktion gibt die byte[]
-Daten und den Namen der Datei zurück.
static (byte[] bytes, string fileName) DownloadAttachment(
IOrganizationService service,
EntityReference target)
{
if (target.LogicalName != "activitymimeattachment")
{
throw new ArgumentException(
"The target parameter must refer to an activitymimeattachment record.",
nameof(target));
}
InitializeAttachmentBlocksDownloadRequest initializeRequest = new()
{
Target = target
};
var response =
(InitializeAttachmentBlocksDownloadResponse)service.Execute(initializeRequest);
string fileContinuationToken = response.FileContinuationToken;
int fileSizeInBytes = response.FileSizeInBytes;
string fileName = response.FileName;
List<byte> fileBytes = new(fileSizeInBytes);
long offset = 0;
long blockSizeDownload = 4 * 1024 * 1024; // 4 MB
// 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(), fileName);
}
Weitere Informationen:
Anmerkungsdateien
Eine Notiz ist ein Datensatz, der einer Tabellenzeile zugeordnet ist, die Text enthält und an die möglicherweise eine einzelne Datei angehängt ist. Nur Tabellen, bei denen EntityMetadata.HasNotes auf true gesetzt ist, können mit Notizen verknüpft werden.
Hochladen von Anmerkungsdateien
Verwenden Sie die InitializeAnnotationBlocksUpload
-, UploadBlock
- und CommitAnnotationBlocksUpload
-Meldungen, um Dateien für Notizen hochzuladen.
Die Anmerkung, die Sie als Target
-Parameter für diese Meldungen übergeben, muss einen annotationid
-Wert haben. So können Sie vorhandene Anmerkungsdatensätze aktualisieren.
Normalerweise ist es am besten, die eindeutigen Kennzeichnungswerte beim Erstellen neuer Datensätze von Dataverse generieren zu lassen, aber das ist bei diesen Nachrichten nicht möglich. Um eine neue Anmerkung mit diesen Nachrichten zu erstellen, müssen Sie einen neuen Guid
-Wert erstellen, den Sie als annotationid
-Wert festlegen, anstatt den Wert von Dataverse generieren zu lassen.
Die folgende statische Methode UploadNote
zeigt, wie Sie mit den Klassen InitializeAnnotationBlocksUploadRequest, UploadBlockRequest und CommitAnnotationBlocksUploadRequest eine Notiz mit einer Datei erstellen oder aktualisieren können. Es gibt eine CommitAnnotationBlocksUploadResponse mit den Eigenschaften AnnotationId
und FileSizeInBytes
zurück.
static CommitAnnotationBlocksUploadResponse UploadNote(
IOrganizationService service,
Entity annotation,
FileInfo fileInfo,
string? fileMimeType = null)
{
if (annotation.LogicalName != "annotation")
{
throw new ArgumentException(
message: "The annotation parameter must be an annotation entity",
paramName: nameof(annotation));
}
if (!annotation.Attributes.Contains("annotationid") || annotation.Id != Guid.Empty)
{
throw new ArgumentException(
message: "The annotation parameter must include a valid annotationid value.",
paramName: nameof(annotation));
}
// documentbody value in annotation not needed. Remove if found.
if (annotation.Contains("documentbody"))
{
annotation.Attributes.Remove("documentbody");
}
// 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";
}
}
// Don't override what might be included in the annotation.
if (!annotation.Contains("mimetype")) {
annotation["mimetype"] = fileMimeType;
}
// Initialize the upload
InitializeAnnotationBlocksUploadRequest initializeRequest = new()
{
Target = annotation
};
var initializeResponse =
(InitializeAnnotationBlocksUploadResponse)service.Execute(initializeRequest);
string fileContinuationToken = initializeResponse.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++;
// Generates base64 string blockId values based on a Guid value so they are always the same length.
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);
}
// Commit the upload
CommitAnnotationBlocksUploadRequest commitRequest = new()
{
BlockList = blockIds.ToArray(),
FileContinuationToken = fileContinuationToken,
Target = annotation
};
return (CommitAnnotationBlocksUploadResponse)service.Execute(commitRequest);
}
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.
Herunterladen von Anmerkungsdateien
Sie können eine Notizdatei in einem einzigen Vorgang über die Web-API oder in Stücken über das SDK oder die Web-API herunterladen.
Laden Sie Anmerkungsdateien in einem einzigen Vorgang über die Web-API herunter
Mit Hilfe der Web-API können Sie eine Notizdatei in einem einzigen Vorgang herunterladen:
Anders als beim Abrufen von Dateispalten liefert diese Methode keine Informationen über die Dateigröße, den Dateinamen oder den MIME Typ.
Anforderung:
GET [Organization Uri]/api/data/v9.2/annotations(<annotationid>)/documentbody/$value HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json
Antwort:
HTTP/1.1 200 OK
OData-Version: 4.0
Content-Type: text/plain
<Base64 string content removed for brevity>
Weitere Informationen:
- Eine Datei in eine einzelne Anforderungen über die Web-API herunterladen
- Den Rohwert einer Eigenschaft abrufen
Download von Anmerkungsdateien in Stücken
Um die Datei in Stücken abzurufen, verwenden Sie die folgenden Nachrichten entweder mit dem SDK oder der Web-API:
Nachricht | Beschreibung |
---|---|
InitializeAnnotationBlocksDownload |
Gibt den Datensatz der Notiz an, von dem 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 |
Fordert die Größe des Blocks, den Offset-Wert und das Dateifortsetzungs-Token an. |
Nachdem Sie alle Blöcke heruntergeladen haben, fügen Sie sie zusammen, um die gesamte heruntergeladene Datei zu erstellen.
Die folgende statische DownloadNote
-Methode zeigt, wie Sie eine Notiz unter Verwendung des SDK mit den Klassen InitializeAnnotationBlocksDownloadRequest und DownloadBlockRequest herunterladen. Diese Funktion gibt die byte[]
-Daten und den Namen der Datei zurück.
static (byte[] bytes, string fileName) DownloadNote(
IOrganizationService service,
EntityReference target)
{
if (target.LogicalName != "annotation")
{
throw new ArgumentException("The target parameter must refer to an note record.", nameof(target));
}
InitializeAnnotationBlocksDownloadRequest initializeRequest = new()
{
Target = target
};
var response =
(InitializeAnnotationBlocksDownloadResponse)service.Execute(initializeRequest);
string fileContinuationToken = response.FileContinuationToken;
int fileSizeInBytes = response.FileSizeInBytes;
string fileName = response.FileName;
List<byte> fileBytes = new(fileSizeInBytes);
long offset = 0;
long blockSizeDownload = 4 * 1024 * 1024; // 4 MB
// 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(), fileName);
}
Weitere Informationen:
Begrenzungen der Dateigröße
Die Spalte Organization.MaxUploadFileSize gibt die maximal zugelassene Größe einer Datei in Bytes für einen Anhang und eine Notiz sowie andere Arten von Daten an, wie z.B. Web-Ressourcendateien, die für modellbasierte Apps verwendet werden. Die maximale Upload-Dateigröße gilt für die Größe der Datei in Base64-Codierung. Eine Base64-Kodierung erzeugt eine Zeichenfolge, die größer ist als die ursprünglichen byte[]
-Dateidaten.
Die Standardgröße beträgt 5 MB (5.242.880 Bytes) und der Höchstwert beträgt 128 MB (131.072.000 Bytes) und kann in den E-Mail-Einstellungen für die Umgebung festgelegt werden. Weitere Informationen: E-Mail-Einstellungen verwalten
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.
Maximale Dateigröße für Uploads abrufen
Sie können die maximale Dateigröße für den Upload auf verschiedene Weise abrufen.
Verwenden Sie eine statische Methode wie die folgende GetMaxUploadFileSize
, um den Wert abzurufen.
public static int GetMaxUploadFileSize(IOrganizationService service) {
QueryExpression query = new("organization") {
ColumnSet = new ColumnSet("maxuploadfilesize")
};
EntityCollection organizations = service.RetrieveMultiple(query);
// There is only one row in organization table
return (int)organizations.Entities.FirstOrDefault()["maxuploadfilesize"];
}
Weitere Informationen:
Maximale Dateigröße für den Upload ändern
Sie können den Wert organization.maxuploadfilesize
auf verschiedene Weise festlegen.
Verwenden Sie eine statische Methode wie die folgende SetMaxUploadFileSize
, um die maximale Dateigröße für den Upload festzulegen.
public static void SetMaxUploadFileSize(
IOrganizationService service,
int maxUploadFileSizeInBytes)
{
if (maxUploadFileSizeInBytes > 131072000 || maxUploadFileSizeInBytes < 1) {
throw new ArgumentOutOfRangeException(nameof(maxUploadFileSizeInBytes),
"The maxUploadFileSizeInBytes parameter must be less than 131072000 bytes and greater than 0 bytes.");
}
QueryExpression query = new("organization")
{
ColumnSet = new ColumnSet("organizationid")
};
EntityCollection organizations = service.RetrieveMultiple(query);
// There is only one row in organization table
Entity organization = organizations.Entities.FirstOrDefault();
organization["maxuploadfilesize"] = maxUploadFileSizeInBytes;
service.Update(organization);
}
Weitere Informationen:
Siehe auch
Dateien und Bilder – Übersicht
Beispiel: Dateivorgänge mit Anlagen und Notizen unter Verwendung des Dataverse SDK für .NET
Beispiel: Dateivorgänge für Anlagen und Anmerkungen mit Dataverse Web-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).