15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Delphi >>> Сетевое программирование

Программирование CGI в Delphi и Kylix

Автор: Paul TOTH
Перевод с французского: Valery Votintsev

Содержание:


Вывод изображений

Заголовок HTTP-ответа для HTML-страниц

Мы уже знаем, что для сообщения браузеру, что передаваемый документ является HTML-документом, CGI-программа выводит специальный заголовок, не отображаемый браузером:
  WriteLn('Content-Type: text/html');
  WriteLn(''); 

HTTP-заголовок для изображений

Точно таким же образом можно с успехом указать и другой тип данных! Например, для вывода изображения в формате GIF достаточно вывести следующее:
  WriteLn('Content-Type: image/gif');
  WriteLn(''); 
Таким образом мы сообщаем браузеру, что далее будет следовать именно изображение...

Передача двоичных данных

Для начала давайте разберемся, как отправить двоичные данные в STDOUTPUT.

Я написал две процедуры: первая выводит поток TSTREAM в STDOUTPUT, а вторая выводит двоичный файл в выходной поток:
 // Процедура вывода потока в STDOUTPUT.
 // Попробуйте самостоятельно переделать ее для Kylix...
 procedure WriteStream(stream:TStream);
  var
   OutStream:THandleStream;
 begin
  Flush(output); // для передачи заголовка мы используем обычный WRITELN...
 // здесь используется код из программы
 // DCOUNTER for Delphi 3 by Dave Wedwick (dwedwick@bigfoot.com)
  OutputStream:=THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE));
  Stream.SaveToStream(OutputStream);
  OutputStream.Free;
 end;

 // Процедура для передачи двоичного файла
 procedure WriteFile(FileName:string);
  var
   s:TFileStream;
 begin
  s:=TFileStream.Create(FileName,fmOpenRead);
  WriteStream(s);
 end;

Передача GIF файлов

Теперь нам осталось только создать (или взять готовый) GIF файл и вывести его!
 procedure WriteGIF(FileName:string);
 begin
   WriteLn('Content-type: image/gif');
   WriteLn;
   WriteFile(FileName);
 end;
Кстати! Долой файлы типа GIF! Burn all GIFs