VI. Blob : afficher des images▲
Avec l'action Detail que nous avons définie dans le chapitre précédent, nous allons afficher l'image. Pour cela, il suffit de créer une nouvelle action que nous appellerons GetImage. Un stream renverra l'image. Il faut impérativement lancer une nouvelle requête pour afficher cette image (ici QImage). Le configuration est la suivante : une table principale NOM et une table secondaire PICTURES avec deux champs : un champ de référence à la table principale (id_nom) et un champ Blob contenant l'image (Pictures)
L'action principale (à rajouter, les gestions d'erreur, etc.)
procedure
TWebModule1.WebModule1WebActionItem3Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var
Handled: Boolean
);
Var
S:TStringList;
begin
//Le TStringList S est notre page HTML
S:=TStringList.Create;
S.Add('<html><body background="/images/backg.gif">'
);
S.Add('<center><table border="0">'
);
Connect_Base;
QFind.SQL.Clear;
//Récupération des paramètres Firstname et Lastname dont on gère
//les '' par QuotedStr ou AnsiQuotedStr;
Qfind.SQL.Add('Select id_nom, Nom, Prenom from Nom where Nom= '
+
QuotedStr(Request.Queryfields.Values['LASTNAME'
])+' and prenom='
+
QuotedStr(Request.QueryFields.Values['FIRSTNAME'
]));
QFind.Open;
If
QFind.RecordCount>0
then
Begin
While
not
QFind.Eof do
Begin
S.Add(Format('<td valign="top">%s <td valign="top">%s<td valign="top">'
,
[QFind.FieldByName('Nom'
).AsString, Qfind.FieldByName('Prenom'
).AsString]);
// On cherche si une image existe
QPicture.SQL.Clear;
QPicture.SQL.Text:='Select * from pictures where id_nom ='
+
QFind.FieldByName('id_nom'
).AsString;
QPicture.Open;
If
QPicture.RecordCount>0
then
Begin
//on va chercher l'image par l'action GetImage et on l'affiche à cet endroit
S.Add(format('<img src="/scripts/adr.dll/GetImage?rec=%d nosave>,
[QFindid_nom.AsInteger])';
end
Else
S.Add('Pas d''image'
);
S.Add('<tr>'
);
QFind.Next;
end
;
S.Add('</table></body></html>'
);
Response.Content:=S;
S.Free;
Disconnect_Base;
//Handled indique que l'action est terminée
Handled:=True
;
end
;
L'action GetImage :
procedure
TWebModule1.WebModule1WebActionItem7Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var
Handled: Boolean
);
Var
MS:TMemoryStream;
begin
//Il faut tout de même faire une nouvelle requête même si l'image avait déjà été sélectionnée par QPicture
If
QImage.Active then
QImage.Close;
QImage.SQL.Text:='Select * from pictures where id_nom='
+Request.QueryFields.Values['rec'
];
QImage.Open;
Ms:=TMemoryStream.Create;
TBlobField(QImage.FieldByName('Pictures'
)).SaveToStream(Ms);
MS.Position:=0
;
Response.ContentType:='image/jpeg'
;
Response.ContentStream:=Ms;
Response.SendResponse;
Handled:=True
;
//Ne pas libérer le TMemoryStream, Delphi s'en charge
end
;
Pour ceux qui ne l'ont pas encore vue, je ne résiste pas au plaisir de vous montrer le résultat de l'action GetImage ;-)
Vous en voulez d'autres ? ;-) 1 / 2 / 3
Si vous voulez transmettre autre chose que des images (exécutables p.ex.), la procédure est la même, vous pouvez passer par un flux. Il suffit de changer la ligne en bleu (content-type) et de mettre le type MIME adéquat : p.ex. application/zip ou application/exe etc.
Pour que votre page affiche p.ex. un fichier à télécharger, vous recherchez l'extension du nom de votre fichier et dans content-type vous mettez : application/+« extension du nom de votre fichier ». Le browser affichera alors le dialogue de téléchargement. Sans cette manière de faire, il affichera le source du fichier.