通过在 Business Central 中使用流式处理来读取和写入文件
流式处理是编程语言中的一个重要概念。 在 AL 中,您可以访问存储在对象(例如文件或 BLOB 字段)中的二进制数据,而无需考虑存储数据所在的对象的实际表示形式、功能或限制。 除了访问文件或 BLOB 中的数据之外,AL 还可让您使用 XMLport 和 HttpClient 数据类型直接从 Business Central 或向 Business Central 流式传输数据。
您可以使用 InStream 和 OutStream 方法从流中读取数据或将数据写入流。 Temp Blob codeunit 可用于在两个流类型之间转换。
InStream 数据类型可用于从流对象读取字节。 数据以二进制格式读取,您可以使用 Read 和 ReadText 函数读取这种格式。
var
InStr: InStream;
FileName: Text;
NumberOfBytesRead: Integer;
TextRead: Text;
begin
if(File.UploadIntoStream('Open File','','All Files (*.*)|*.*',
FileName, InStr)) then begin
while not InStr.EOS() do begin
NumberOfBytesRead := InStr.ReadText(TextRead, 100);
Message('%1\Size: %2', TextRead, NumberOfBytesRead);
end;
end;
end;
OutStream 数据类型可用于向流对象写入字节。 数据以二进制格式写入,您可以使用 Write 和 WriteText 函数读取这种格式。
var
OutStr: OutStream;
MyTable: Record MyTable;
begin
if (MyTable.FindFirst()) then begin
MyTable.Data.CreateOutStream(OutStr);
OutStr.WriteText('<html>');
OutStr.WriteText('<body>');
OutStr.WriteText('<h1>AL Language in Business Central is awesome!</h1>');
OutStr.WriteText('</body>');
OutStr.WriteText('</html>');
end;
end;
您可以使用流式处理功能通过 Business Central 上传和下载图像。 Media 和 MediaSet 数据类型支持使用 InStream 数据类型。 以下代码示例展示了如何使用客户表的图片字段(MediaSet 数据类型)通过流式处理功能存储图像。
local procedure ChangeCustomerPicture(Customer : Record Customer)
var
CustomerInStream : InStream;
ImageFilter : Text;
begin
ImageFilter := 'Image Files (*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif';
if not UploadIntoStream(ImageFilter, CustomerInStream) then
exit;
Customer.Image.ImportStream(CustomerInStream,'Customer Picture');
end;
要导出图像,您可以使用 DownloadFromStream 函数。 以下代码示例展示了某个 MediaSet 中将要下载的所有图像。 用户在下载每个图像时都会收到提示。
local procedure DownloadCustomerPicture(Customer : Record Customer)
var
TempBlob : Codeunit "Temp Blob";
CustomerOutStream : OutStream;
CustomerInStream : InStream;
ImageFilter, FileName : Text;
begin
TempBlob.CreateOutStream(CustomerOutStream);
Customer.Image.ExportStream(CustomerOutStream);
TempBlob.CreateInStream(CustomerInStream);
ImageFilter := 'Image Files (*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif';
FileName := 'Customer Picture';
if not DownloadFromStream(CustomerInStream,'Download Customer Picture','',ImageFilter, FileName) then
exit;
end;