Recherche personnalisée
Navigation :

Guides informatiques - Retour

 Image tiret PC

  
Le 11-12-2006 à 14h47
par ludovic
(4020 lectures)

Afficher une image à partir d'un champ BLOB



Introduction



Lors d'un projet de classe en C# de l'an dernier, nous devions développer un logiciel qui envoyait des photographies et qui devaient être centralisées.

Nous avions choisis de sauvegarder les photographies directement en base de données et qui étaient stockées dans un champ BLOB en SQL Server.

Le principal avantage de cette solution est de pouvoir sauvegarder facilement les photographies, en effet, un simple DUMP de la base SQL permettrait de stocker l'ensemble des photographies.
De même, en ajoutant un autre serveur en cluster, la disponibilité et la vitesse pouvaient-être facilement augmentées.

Voici la solution pour afficher l'image à la volée à partir de cette base de données sur une page Web.

Code C#



<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">

byte[] TabByte; // tableau de byte

private void Page_Load(object sender, System.EventArgs e)
{
int monId;
monId = Int32.Parse(Request.Params["id"]); // récupération de l'ID dans l'URL

String strConnection;
strConnection = ConfigurationSettings.AppSettings["myConnection"]; // appel de la chaine de connexion à partir du fichier web.config

SqlConnection maConnection;
SqlCommand maCommande;
SqlDataReader monReader;

String SelectCommand1 = "SELECT image_contenu " +
"FROM IMAGES " +
"WHERE id_image = " + monId + "";

maConnection = new SqlConnection(strConnection);
maCommande = new SqlCommand(SelectCommand1, maConnection);

try
{
maConnection.Open();

monReader = maCommande.ExecuteReader();
monReader.Read(); // pas de while car 1 seul enregistrement retourné

TabByte = (byte[]) monReader["image_contenu"]; // caste Objet en tableau de Byte[]

MemoryStream imageStream = new MemoryStream(TabByte); // instancie le memoryStream avec le tableau de byte
Bitmap monImageBlob = new Bitmap(imageStream); // on envoie le contenu du stream dans un Bitmap


MemoryStream writeStream = new MemoryStream(); // nécessite un Stream secondaire

Response.ContentType = "image/jpeg"; // précise que c'est une image dans le header du navigateur
monImageBlob.Save(writeStream,System.Drawing.Imaging.ImageFormat.Jpeg);
writeStream.WriteTo(Response.OutputStream);
monImageBlob.Dispose(); // libère les ressources

monReader.Close();
}
catch
{
maConnection.Close();
}

}

</script>
<asp:Image id="Image1" runat="server"></asp:Image>


Explication du code



Il est tout à fait possible d'afficher l'image dans une PictureBox à partir du tableau de Byte dans une Windows Form. C'est l'affichage dans une page Web qui nécessite quelques modifications.

Le code ci-dessus récupère l'ID (N° de la photographie) dans l'URL, puis la requête est créée.
Le champ image_contenu est de type BLOB.

Le code est commenté pour bien suivre les étapes.

Il ne faut surtout pas oublié le second MemoryStream() !

MemoryStream writeStream = new MemoryStream(); // nécessite un Stream secondaire

Response.ContentType = "image/jpeg"; // précise que c'est une image dans le header du navigateur


Le Response.ContentType permet au navigateur Internet de comprendre qu'on lui envoit une image.

Puis l'on affiche l'image :

monImageBlob.Save(writeStream,System.Drawing.Imaging.ImageFormat.Jpeg);
writeStream.WriteTo(Response.OutputStream);


Utilisation du code



Copions le code complet dans une page que l'on va nommer voir_image.aspx. Pour afficher une image il suffira de l'appeler en ajoutant une valeur à l'ID : voir_image.aspx?id=3.

Conclusion



J'espère que ce code saura vous aider car je n'avais rien trouvé sur Internet à l'époque sur ce sujet, car très peu de personne utilise le champ BLOB.
Pourtant, ce n'est pas un problème de stocker de grosses données dans ce type de champ.

TOP 5 : Configurer et ouvrir les ports de sa FreeBox Configurer sa NeufBox version 4 Installation de Nagios et Oréon : monitoring de parc informatique Enregistrer et encoder un film enregistré à partir d'une FreeBox Test du Linksys WAG200G-FR (modem/routeur ADSL, compatible ADSL2)      
Connectés en ligne : 5 -- © Copyright PC Futé 2003-2008
Page exécutée en 0.896 seconde.
Partenaire : Configuration serveur Linux