IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

DIDACTITIEL ISAPI AVEC LES COMPOSANTS INTERNET DE DELPHI 5/6/7 enterprise


précédentsommairesuivant

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.)

 
Sélectionnez
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 :

 
Sélectionnez
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 ;-)

Image non disponible

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.


précédentsommairesuivant

Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.