File attachments, XMLport, and Azure Blob Storage patterns for Business Central
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
UploadIntoStream opens file dialog, InStream contains dataIsSuccessful()Note: ALWAYS CalcFields(BlobField) before CreateInStream. Web Client allows only ONE DownloadFromStream per request.
// Upload
if UploadIntoStream('Select file', '', 'All Files (*.*)|*.*', FileName, InStr) then
// Process InStr
// Download - MUST CalcFields first for Blob
CalcFields("File Content");
if "File Content".HasValue() then begin
"File Content".CreateInStream(InStr);
DownloadFromStream(InStr, '', '', '', FileName);
end;Standard (Table 1173):
// Replace <SourceTable> and field names with your record
DocumentAttachment.Init();
DocumentAttachment.Validate("Table ID", Database::<SourceTable>);
DocumentAttachment.Validate("No.", <Record>."<KeyField>");
DocumentAttachment.Validate("Document Type", <Record>."<TypeField>"); // If applicable
DocumentAttachment.InsertFromStream(InStr, FileName);Custom Blob field:
Rec."File Content".CreateOutStream(OutStr);
CopyStream(OutStr, InStr);
Rec.Modify();xmlport <ID> "<PREFIX> Import Data"
{
Direction = Import;
Format = VariableText;
FieldDelimiter = '"';
FieldSeparator = ';';
TextEncoding = UTF8;
schema
{
textelement(Root)
{
tableelement(TempImport; "<PREFIX> Import Buffer")
{
UseTemporary = true;
AutoSave = false;
fieldelement(ItemNo; TempImport."Item No.") { }
fieldelement(Description; TempImport.Description) { }
trigger OnAfterInsertRecord()
begin
ProcessLine(TempImport);
end;
}
}
}
}Key properties: Direction (Import/Export/Both), Format (Xml/VariableText/FixedText), TextEncoding (UTF8/UTF16)
var
ABSBlobClient: Codeunit "ABS Blob Client";
StorageServiceAuthorization: Codeunit "Storage Service Authorization";
Authorization: Interface "Storage Service Authorization";
begin
Authorization := StorageServiceAuthorization.CreateSAS(GetSASToken());
ABSBlobClient.Initialize(AccountName, ContainerName, Authorization);
// Upload
TempBlob.CreateInStream(InStr);
ABSOperationResponse := ABSBlobClient.PutBlobBlockBlobStream(BlobName, InStr);
// Download
ABSOperationResponse := ABSBlobClient.GetBlobAsStream(BlobName, InStr);
end;Requires: Azure Storage Account + SAS Token in Isolated Storage.
// Store (returns GUID key)
BlobKey := PersistentBlob.Create();
PersistentBlob.CreateOutStream(OutStr);
OutStr.WriteText(Data);
// Retrieve
PersistentBlob.CreateInStream(BlobKey, InStr);
InStr.ReadText(Data);
PersistentBlob.Delete(BlobKey); // Clean up⚠️ NOT for permanent storage - causes locking issues.
// JSON
JsonObj.Add('key', 'value');
JsonObj.WriteTo(JsonText);
JsonObj.ReadFrom(JsonText);
if JsonObj.Get('key', JsonTok) then MyText := JsonTok.AsValue().AsText();
// XML
XmlDoc := XmlDocument.Create();
XmlDoc.Add(XmlElement.Create('Root'));
XmlDocument.ReadFrom(XmlText, XmlDoc);
XmlDoc.SelectSingleNode('//Child', XmlNode);