通过在 Business Central 中使用流式处理来读取和写入文件

已完成

流式处理是编程语言中的一个重要概念。 在 AL 中,您可以访问存储在对象(例如文件或 BLOB 字段)中的二进制数据,而无需考虑存储数据所在的对象的实际表示形式、功能或限制。 除了访问文件或 BLOB 中的数据之外,AL 还可让您使用 XMLport 和 HttpClient 数据类型直接从 Business Central 或向 Business Central 流式传输数据。

您可以使用 InStreamOutStream 方法从流中读取数据或将数据写入流。 Temp Blob codeunit 可用于在两个流类型之间转换。

InStream 数据类型可用于从流对象读取字节。 数据以二进制格式读取,您可以使用 ReadReadText 函数读取这种格式。

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 数据类型可用于向流对象写入字节。 数据以二进制格式写入,您可以使用 WriteWriteText 函数读取这种格式。

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;