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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web avec .NET Discussion :

Afficher Image binaire depuis BDD C# asp.net


Sujet :

Développement Web avec .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 28
    Par défaut Afficher Image binaire depuis BDD C# asp.net
    Bonjour,

    Voila plusieurs heures que j'essaye d'afficher une image depuis une BDD sans l'enregistrer sur le client ou le serveur.

    J'ai donc créer un Handler.ashx:
    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
    61
    62
    63
    64
    65
    66
    67
     
    public ConnexionSQL connec = new ConnexionSQL();
        private string CONNEXION_SQL_Reference;
     
     
        public void ProcessRequest (HttpContext context) {
            HttpRequest request = context.Request;
            HttpServerUtility server = context.Server;
            context.Response.ContentType = "image/jpeg";
            CONNEXION_SQL_Reference = connec.ConnexionEcommerce();
            if (context.Request.QueryString["imgId"] != null)
            {
                string imgId = "";
                imgId = context.Request.QueryString["imgId"];
     
                byte[] tab = GetImageFromDB(imgId);
     
                MemoryStream memoryStream = new MemoryStream(tab, false);
                System.Drawing.Image imgFromGB = System.Drawing.Image.FromStream(memoryStream);
                imgFromGB.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
     
            }
     
        }
     
        private byte[] GetImageFromDB(string serie)
        {
     
             byte[] imageBytes = null;
     
            try
            {
     
                System.Data.SqlClient.SqlConnection myConnection2 = new System.Data.SqlClient.SqlConnection();
                myConnection2.ConnectionString = CONNEXION_SQL_Reference;
     
                myConnection2.Open();
                System.Data.SqlClient.SqlCommand myCommand2 = new System.Data.SqlClient.SqlCommand("SELECT [NumSerie],[Image],[NomImage] FROM [BDD].[dbo].[Img] where [NumSerie]='" + serie + "'", myConnection2);
     
                System.Data.SqlClient.SqlDataReader myReader3 = null;
                myReader3 = myCommand2.ExecuteReader();
     
     
                myReader3.Read();
               imageBytes = (byte[])myReader3["Image"];
     
     
     
                myConnection2.Close();
     
                return imageBytes;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
     
            }
        }
     
        public bool IsReusable {
            get {
                return true;
            }
        }
    Puis depuis ma page aspx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     <asp:Image ID="imgProfile" Visible="true" runat="server" />
      imgProfile.ImageUrl = "~/Account/Handler.ashx?imgid=" + serie;
    Mon problème est que j'ai l'erreur invalid Parameter sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     System.Drawing.Image imgFromGB = System.Drawing.Image.FromStream(memoryStream);
    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Les lignes 18 à 20 de ton premier bloc de code ne servent à rien, puisque tu as déjà récupéré ton image juste avant, dans la variable "tab"

    Je pense que si tu remplaces ces 3 lignes (18 à 20) par cette ligne : context.Response.BinaryWrite(tab);, ça devrait suffire.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 28
    Par défaut
    Merci je viens de tester mais l'image ne s'affiche pas.
    J'ai vérifié est ma requête est bonne ainsi que le paramètre passé en get, voici mon nouveau code avec ton avis :

    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
     
    public void ProcessRequest (HttpContext context) {
            HttpRequest request = context.Request;
            HttpServerUtility server = context.Server;
            context.Response.ContentType = "image/jpeg";
            CONNEXION_SQL_Reference = connec.ConnexionEcommerce();
            if (context.Request.QueryString["imgId"] != null)
            {
                string imgId = "";
                imgId = context.Request.QueryString["imgId"];
     
                byte[] tab = GetImageFromDB(imgId);
     
                context.Response.BinaryWrite(tab);
     
            }
     
        }

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    OK, ne touche plus à cette méthode ProcessRequest. Il y a un souci semble-t-il dans ton autre méthode, la voici, j'en ai profité pour la réécrire au passage :

    Code C# : 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
    private byte[] GetImageFromDB(string serie)
    {
        byte[] imageBytes = null;
        using (var conn2 = new System.Data.SqlClient.SqlConnection(CONNEXION_SQL_Reference))
        {
            conn2.Open();
     
            var query = "SELECT [NumSerie], [Image], [NomImage] FROM [BDD].[dbo].[Img] WHERE [NumSerie]=@Serie";        
            using (var cmd2 = new System.Data.SqlClient.SqlCommand(query, conn2))
            {
                cmd2.Parameters.AddWithValue("@Serie", serie);
                using (var dr3 = cmd2.ExecuteReader())
                {
                    while (dr3.Read())
                    {
                        if (dr3["Image"] != DBNull.Value)
                        {
                            imageBytes = (byte[])dr3["Image"];
                        }
                    }
                }
            }
        }
     
        return imageBytes;
    }

    Tu noteras plusieurs changements :
    Utilisation de blocs using. Ils permettent de mieux gérer la libération des ressources, y compris en cas d'erreur. Voir la Référence MSDN.
    Utilisation d'une requête paramétrée, afin d'éviter notamment les injections SQL.
    Il faut utiliser une boucle while (dr3.Read()).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 28
    Par défaut
    Merci pour ton aide j'ai essayé ta méthode mais j'ai toujours le même problème l'image ne s'affiche pas (cela ne viendrait pas de IE10?)

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Met un point d'arrêt sur cette ligne : byte[] tab = GetImageFromDB(imgId);. Est-ce que "tab" contient quelque chose ?

    Second test à faire, si tu vas directement sur l'URL de ton handler, est-ce que l'image s'affiche ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/11/2008, 09h44
  2. Poster un Email depuis une page ASP.net 2.0
    Par Delphi-ne dans le forum ASP.NET
    Réponses: 4
    Dernier message: 30/04/2008, 11h18
  3. Réponses: 1
    Dernier message: 14/02/2008, 22h47
  4. piloter excel depuis un site ASP.NET
    Par sergio94 dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 22/01/2008, 15h25
  5. Réponses: 1
    Dernier message: 01/06/2006, 09h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo