Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Программирование для Internet >> Пример формирования потоков данных.

[Назад]    [Содержание ]    [Вперед]

  


Пример формирования потоков данных.


Пример формирования потоков данных

Для построения примера образования потока данных выберите из главного меню команду File=>New, а затем из диалогового окна New Items пиктограмму Web Server Application. В результате вы получите заготовку модуля TWebModule. Перейдите в окно Web Module, выберите его, а затем перейдите в окно инспектора объектов. Дважды щелкните на свойстве Actions и создайте три действия с именами /file, /bitmap и /resource.

Выберите действие /file, перейдите в окно инспектора объектов и выберите вкладку Events. Создайте событие OnAction, а затем добавьте в обработчик этого события следующий код:

procedure TWebModule1.WebModule1WebActionItem2Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
═════FS: TFileStream;
begin
═════FS := TFileStream.Create(JPEGFilename, fmOpenRead);
═════try
══════════Response.ContentType := 'image/jpeg';
══════════Response.ContentStream := FS;
══════════Response.SendResponse;
══════════Handled := True;
═════finally
══════════FS.Free;
═════end;
end;

Приведенный код довольно прост. Обработчик события OnAction создает класс TFileStream, который загружает файл; затем он устанавливает соответствующий тип MIME, чтобы сообщить броузеру клиента о передаче JPEG-файла, и присваивает результат создания экземпляра класса TFileStream свойству Response.ContentStream. Данные затем возвращаются клиенту путем вызова метода Response.SendResponse. В результате на переданной HTML-странице должно появиться изображение из указанного файла.

На заметку В HTML-коде, отображающем JPEG-файл в вашем броузере, вы можете просто разместить ссылку в IMG-дескрипторе:

<IMG SRC="../bin/streamex.dll/file" BORDER=0>

Действие /bitmap загрузит другое графическое изображение, причем иным способом. Код реализации этого действия несколько сложнее и имеет следующий вид:

procedure TWebModule1.WebModule1WebActionItem3Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Hadled: Boolean);
var
═════BM: Bitmap;
═════JPEGImage: TJPEGImage;
begin
═════BM := TBitmap.Create;
═════JPEGImage := TJPEGImage.Create;
═════try
══════════BM.Handle := LoadBitmap(hInstance, ?ATHENA?);
══════════JPEGImage.Assign(BM);
══════════Response.ContentStream := TMemoryStream.Create;
══════════JPEGImage.SaveToStream(Response.ContentStream);
══════════Response.ContentStream.Position := 0;
══════════Response.SendResponse;
══════════Handled := True;
═════finally
══════════BM.Free;
══════════JPEGImage.Free;
═════end;
end;

Преобразование растрового изображения в JPEG-файл с последующей передачей клиенту требует больших затрат. Для захвата растра из файла ресурсов используется класс TBitmap, а для выполнения операции преобразования растра в JPEG-файл создается экземпляр класса TJPEGImage из модуля JPEG.

После создания класса TBitmap вызывается функция Windows API LoadBitmap для захвата растра из файла ресурсов с именем 'ATHENA'. Функция LoadBitmap возвращает дескриптор растра, который присваивается свойству Handle. Сам растр после этого сразу же назначается экземпляру класса TJPEGImage, а метод Assign благодаря перегрузке обладает достаточным интеллектом, чтобы "сообразить", что от него требуется преобразование растра в формат JPEG.

Последующие инструкции служат прекрасным примером полиморфизма. Свойство Response.ContentStream объявляется как абстрактный класс TStream. Благодаря полиморфизму для создания можно использовать любой тип потомка класса TStream. В данном случае создается экземпляр класса TMemoryStream, и именно он используется для сохранения JPEG-файла, причем для этого вызывается метод TJPEGImage.SaveToStream. Теперь наш JPEG-файл находится в потоке и готов к пересылке. После сохранения JPEG-файла в потоке необходимо вернуть позицию потока к нулевой отметке. Это очень важный шаг, но, к сожалению, о нем очень часто забывают! Если этого не сделать, текущая позиция потока будет указывать на его конец, а значит, никакие данные не будут отправлены клиенту. После этого вызывается метод Response.SendResponse, выполняющий отправку данных, сохраненных в потоке.

Еще один способ загрузки JPEG-файла заключается в использовании файла ресурсов. Вы можете загрузить JPEG-данные в файл *.RES, используя приведенный ниже код в файле *.RC, с последующей его компиляцией с помощью файла BRCC32.EXE. Если загружать данные как ресурс типа RCDATA, то можно прибегнуть к услугам класса TResourceStream, что позволит легко загрузить данные и отправить их броузеру клиента. Класс TResourceStream очень мощный и способен загрузить ресурс либо из самого ЕХЕ-файла, либо из ресурса, размещенного в любом файле библиотеки DLL. Как это делается, иллюстрируется с помощью действия /resource, а загрузка JPEG-данных выполняется из файла ресурсов с именем 'JPEG', который скомпилирован в ЕХЕ-файл:

procedure TWebModule1.WebModule1.WebActionItem4Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
═════Response.ContentStream := TResourceStream.Create(hInstance, ?JPEG?, RT_RCDATA);
═════Response.ContentType := ?image/jpeg?;
═════Response.SendResponse;
═════Handled := True;
end;

С помощью этого кода данные посылаются клиенту несколько другим способом. Вам снова повезло: перед вами более простой, но не менее прекрасный пример полиморфизма. Сначала создается экземпляр класса TResourceStream, который назначается свойству ContentStream. Поскольку конструктор класса TResourceStream сам загружает ресурс в поток, то вам уже не нужно предпринимать никаких дальнейших действий по формированию потока, а остается просто вызвать метод Response.SendResponse для отправки данных потока клиенту.

В заключительном примере клиенту отправляется WAV-файл, который хранится в виде RCDATA-pecypca. Здесь используется метод Response.SendStream, который отправляет поток, создаваемый внутри этого метода. Тем самым иллюстрируется еще один способ пересылки потоковых данных: вы можете создать поток и модифицировать его при необходимости, а затем послать его клиенту с помощью метода SendStream.

[Листинг с примером формирования потоков данных]




[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017