2010-03-11 6 views
0

Je veux lire à partir de la base de données où j'ai stocké une image dans un champ binaire et afficher une image.Comment lire la colonne binaire dans la base de données en image sur la page asp.net?

while (reader.Read()) 
    { 
     byte[] imgarr = (byte[])reader["file"]; 

     Stream s = new MemoryStream(imgarr); 
     System.Drawing.Image image = System.Drawing.Image.FromStream(s); 
     Graphics g = Graphics.FromImage(image); 
     g.DrawImage(image, new Point(400, 10)); 
     image.Save(Response.OutputStream, ImageFormat.Jpeg); 
     g.Dispose(); 
     image.Dispose(); 
    } 
    con.Close(); 

Ce morceau de code ne fonctionne pas:

System.Drawing.Image image = System.Drawing.Image.FromStream(s); 

J'ai essayé le code de this article. Et je suis la même erreur « le paramètre est pas valide ». Peut-être que je ne suis pas au courant de quelque chose, un réglage dans sql server ou webconfig ou sth else. Quelqu'un d'autre qui a de l'expérience en récupérant des images de la base de données?

Le paramètre n'est pas valide est le message d'erreur . La table db contient des données. Qu'est-ce que je fais de mal?

+0

Dans quel format se trouve l'image? – dsolimano

+2

"Ne fonctionne pas" n'est pas un diagnostic très détaillé. Qu'est-ce qui se passe réellement? Une exception est-elle levée? Si oui, quoi et où est-il jeté? –

+0

Avez-vous vérifié si 'imgarr' contient des données? – AxelEckenberger

Répondre

0

La ligne que vous dites ne fonctionne pas me semble correcte. Puisque vous n'avez pas dit quel type d'image, c'est peut-être un format non supporté.

Sinon, je vais hasarder une hypothèse que le problème réel est à

byte[] imgarr = (byte[])reader["file"]; 

et le tableau d'octets ne contient pas les données que vous pensez qu'elle devrait.

0

réglage général la position Stream à 0 le tour est joué:

Stream s = new MemoryStream(imgarr); 
s.Position = 0; 
0

Vous pouvez consulter le fichier dbfileStaticSql.cs a un peu de ce que vous recherchez.

conn.Open(); 
SqlDataReader rdr = cmd.ExecuteReader(); 
if (rdr.Read()) 
{ 
    ... other code 

    byte[] filebytes = (byte[])rdr[FILE_STREAM]; 
    result.FileBytes = new byte[filebytes.Length]; 
    Array.Copy(filebytes, result.FileBytes, filebytes.Length); 
} 

Le DBFile.cs a le code d'écriture de fichier

response.ContentType = file.ContentType; 

byte[] buffer = new byte[file.ByteCount]; 
file.Read(buffer, 0, file.ByteCount); 
response.BinaryWrite(buffer); 

Tant que vous définissez le type de contenu de la réponse et vous écrivez le fichier dans la réponse que vous ne devriez pas avoir besoin de créer la image, puis enregistrez-le (sauf si vous en faites une édition).

3
public Byte[] Ret_image(Int32 id) 

    { 

     SqlCommand cmd = new SqlCommand(); 

     cmd.CommandText = "select*from tbimage where [email protected]"; 

     cmd.Connection = con; 

     cmd.Parameters.Add("@id", SqlDbType.Int).Value = id; 

     SqlDataReader dr = cmd.ExecuteReader(); 

     dr.Read(); 

     Byte[] ar = (Byte[])(dr[1]); 

     dr.Close(); 

     cmd.Dispose(); 

     return ar; 

    } 

    protected void btnRetImage_Click(object sender, EventArgs e) 

    { 

     try 

     { 

      Byte[] ar = Ret_image(Convert.ToInt32(TextBox2.Text)); 

      String st = Server.MapPath("abc.jpg"); 

      FileStream fs = new FileStream(st, FileMode.Create, FileAccess.Write); 

      fs.Write(ar, 0, ar.Length); 

      fs.Close(); 

      Image1.Visible = true; 

      Image1.ImageUrl = "abc.jpg"; 

      Label1.Visible = false; 
} 
catch(Expration exp) 
{ 
Label1.Text = "Wrong Image id"; 

      Label1.Visible = true; 

      Image1.Visible = false; 

     } 

    } 

} 
+0

Il doit être marqué comme ayant reçu une réponse. – reaz

Questions connexes