[Look Inside] -Sommaire -Les Paramètres -Redirection - Les Images -protection par mot de passe -Les cookies -Base de Données -FAQ

Programmes CGI avec Delphi et Kylix - Les images en CGI


Ce que l'on sait déjà

Nous savons que le programme CGI renvoie au serveur une entête non visible dans le browser :
  WriteLn('Content-Type: text/html');
  WriteLn(''); 
 

Ce que j'avais pas dit

C'est qu'on peut très bien renvoyer un autre type de donnée ! comme par exemple :
  WriteLn('Content-Type: image/gif');
  WriteLn(''); 
 
Il s'agit maintenant d'envoyer l'image...

Envoyer des données binaires

Dans un premier temps, voici comment envoyer des données binaire sur StdOutput.

J'ai écrit une procédure générique pour envoyer un TStream vers StdOutput avec un paramètre Head pour pouvoir ajouter une entête:
 // pas encore porté sous Kylix, désolé
 procedure WriteStream(stream:TStream);
  var
   OutStream:THandleStream;
 begin
  Flush(output); // pour l'entête envoyée par des WriteLn...
 // code from DCounter for Delphi 3 by Dave Wedwick (dwedwick@bigfoot.com)
  OutputStream:=THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE));
  Stream.SaveToStream(OutputStream);
  OutputStream.Free;
 end;

 // On utilisera également WriteFile pour envoyer un fichier existant :
 procedure WriteFile(FileName:string);
  var
   s:TFileStream;
 begin
  s:=TFileStream.Create(FileName,fmOpenRead);
  WriteStream(s,Head);
 end;
 

Reste à créer un GIF !

Pour celà, j'ai une unité GIF qui sauvegarde un TBitmap dans un Stream au format GIF. Il reste alors à utiliser :
 procedure WriteBitmapAsGIF(Bitmap:TBitmap);
  Var
   GifStream:TMemoryStream;
 begin
  Try
   GifStream:=TMemoryStream.Create;
   BitmapToGifStream(Bitmap,GifStream);
   WriteLn('Content-type: image/gif');
   WriteLn;
   WriteStream(GifStream);
  Finally
   GifStream.Free;
  end;
 end;
 
Mais oui non ! je vous la file pas l'unité GIF ! Burn all GIFs
  <img src="/cgi-bin/draw?Voici le Texte"> donne 
 

c'est tout ! A +