Afficher une image depuis la base de données
Bonjour !
J'essaie en vain depuis quelques temps d'afficher une image mémorisée dans ma base de données. Je suis sous SQL Server 2005, et mon image est un champ de type varbinary(max), située dans la table "PRODUIT", et qui peut être obtenu par la procédure stockée "get_image_produit @id numeric(18,0)".
Après avoir fait quelques recherches, j'ai compris qu'il fallait créer une nouvelle page aspx dont le seul boulot est de contenir les données de l'image et dont le type est image.
Ma page (nommée GetImage.aspx) prend dans son url les paramètre "type" et "id", qui vont servir à indiquer quelle procédure stockée utilisée, puisque j'en aurai besoin dans d'autres parties de mon application, pour d'autres choses (non implémentées pour l'instant).
Voici donc le code behind :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
protected void Page_Load(object sender, EventArgs e)
{
// On met le contenu de la page en tant qu'image jpeg
// et on enlève les headers de réponse
Response.ContentType = "image/jpeg";
Response.Clear();
// Réponse buffer de manière à ce que la page soit
// envoyée après les taitements
Response.BufferOutput = true;
// On récupère le type et l'id de l'objet à aller chercher
string type = "" + Request["type"];
string id = "" + Request["id"];
Int32 id_pro;
// S'il y a un problème dans les paramètres, on sort
if (type == "" || id == "" || Int32.TryParse(id, out id_pro))
{
Response.Flush();
return;
}
// Le tableau de bytes contenant le contenu de l'image
byte[] imageBytes;
// Selon le type, on va effectuer des requêtes différentes
switch (type)
{
case "produit":
DbCommand command = DataProvider.CreateCommandSP("get_image_produit");
IDataParameter paramId = command.CreateParameter();
paramId.ParameterName = "@id";
paramId.DbType = DbType.Int32;
paramId.Value = id_pro;
paramId.Direction = ParameterDirection.Input;
command.Parameters.Add(paramId);
imageBytes = (byte[])DataProvider.CreateDataSet(command).Tables[0].Rows[0]["pro_image"];
break;
// On rajoutera d'autres cases plus tard
default :
Response.Flush();
return;
}
Bitmap image = ConvertorToolBox.byteArrayToBitmap(imageBytes);
image.Save(Response.OutputStream, ImageFormat.Jpeg);
image.Dispose();
// On envoie la sortie au client
Response.Flush();
} |
(DataProvider et ConvertorToolBox sont des classes à moi, mais elles fonctionnent)
Le problème et bien... C'est que ça ne marche pas. Lorsque j'appelle la page (par exemple "http://localhost:1059/Pages/GetImage.aspx?type=produit&id=17"), l'url s'affiche dans la page et c'est tout.
Quelqu'un a-t-il une idée ?
Merci beaucoup !