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:
procedure WriteStream(stream:TStream;Head:String);
var
buffer:array[0..1024] of char;
l:integer;
f:file;
begin
assignfile(f,''); rewrite(f,1); // this will overide any previous output (WriteLn)
// but I can't find an other way to do this quickly !
if head<>'' then BlockWrite(f,head[1],length(head));
Stream.position:=0;
l:=Stream.Read(buffer,sizeof(buffer));
while l>0 do begin
BlockWrite(f,buffer,l);
l:=Stream.Read(buffer,sizeof(buffer));
end;
closefile(f);
end;
On utilisera également WriteFile pour envoyer un
fichier existant :
procedure WriteFile(FileName:string;Head: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);
WriteStream(GifStream,'Content-type: image/gif'+#13#10+
#13#10);
Finally
GifStream.Free;
end;
end;
Mais oui non ! je vous la file pas
l'unité GIF !
<img src="/cgi-bin/draw?Voici le Texte"> donne
c'est tout ! A + Suite du tutoriel : Sommaire, Introduction, Les paramètres, Redirection,
Les images, protection par mot de passe,
Les cookies, Base de
données, FAQ
|