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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !