2014-07-06 5 views
0

J'ai des données binaires dans une colonne d'image et je suis nécessaire pour récupérer l'image et l'afficher. J'ai donc ajouté un fichier ashx et dans le fichier aspx j'ai une zone de texte pour le nom de l'image et un contrôle fileupload. Les images sont insérées avec succès mais je pense (je suis presque sûr) que quelque chose ne va pas dans le fichier ashx mais ne trouve pas où. Je ne reçois aucune exception. Ça ne marche tout simplement pas.Impossible de récupérer les données binaires

Ceci est mon code:

protected void butSubmit_Click(object sender, EventArgs e) 
{ 
    byte[] imgbyte = null; 
    if (FileUpload1.HasFile && FileUpload1.PostedFile != null) 
    { 
     HttpPostedFile file = FileUpload1.PostedFile; 
     imgbyte = new byte[file.ContentLength]; 
     file.InputStream.Read(imgbyte, 0, file.ContentLength); 
    } 

    SqlConnection connection = new SqlConnection(@"server=.\sqlexpress;database=projects;Uid=sa;Password=1234"); 

    connection.Open(); 
    SqlCommand cmd = new SqlCommand("Insert imgtable values(@title,@image) select @@IDENTITY",connection); 
    cmd.Parameters.AddWithValue("@title",txtTitle.Text); 
    cmd.Parameters.AddWithValue("@image", imgbyte); 
    int id = Convert.ToInt32(cmd.ExecuteScalar()); 
    Image1.ImageUrl = "~/Handler.ashx?id=" + id; 
    connection.Close(); 
} 

Ceci est le fichier de gestionnaire générique:

public class Handler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     if(context.Request.QueryString["id"]!=null) 
     { 
      int id=Convert.ToInt32(context.Request.QueryString["id"]); 
      Stream stream = DisplayImage(id); 
      context.Response.ContentType = "image/jpeg"; 
      byte[]img=new byte[stream.Length]; 
      context.Response.OutputStream.Write(img, 0, img.Length); 
     } 
    } 

    public Stream DisplayImage(int theID) 
    { 
     SqlConnection con=new SqlConnection (@"server=.\sqlexpress;database=projects;Uid=sa;Password=1234"); 
     SqlCommand cmd=new SqlCommand ("select image from imgtable where [email protected]",con); 
     con.Open(); 
     cmd.Parameters.AddWithValue("@id",theID); 
     byte[] img = (byte[])cmd.ExecuteScalar(); 
     con.Close(); 
     return new MemoryStream(img); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

Répondre

1

Vous initialisez un nouveau tableau d'octets avec la longueur du cours d'eau, mais il n'y a rien dans cet octet tableau. Je parle du tableau img byte dans ProcessRequest. Faire la méthode DisplayImage retourner le tableau d'octets et l'utiliser directement. Vérifiez également avec le débogueur si img dans DisplayImage contient des données.

public class Handler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     if(context.Request.QueryString["id"]!=null) 
     { 
      int id=Convert.ToInt32(context.Request.QueryString["id"]); 
      byte[] img = DisplayImage(id); 
      context.Response.ContentType = "image/jpeg"; 
      context.Response.OutputStream.Write(img, 0, img.Length); 
     } 
    } 

    public byte[] DisplayImage(int theID) 
    { 
     SqlConnection con=new SqlConnection (@"server=.\sqlexpress;database=projects;Uid=sa;Password=1234"); 
     SqlCommand cmd=new SqlCommand ("select image from imgtable where [email protected]",con); 
     con.Open(); 
     cmd.Parameters.AddWithValue("@id",theID); 
     byte[] img = (byte[])cmd.ExecuteScalar(); 
     con.Close(); 
     return img; 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+0

Merci ... Vous voulez dire que je ne peux pas directement me lier à un tableau d'octets. Vous vouliez dire cela. – user3733078

+1

Vous ne pouvez pas (vous utilisez la méthode Read ou quelque chose comme Memory Stream) mais même si vous pouviez vous ne l'avez pas fait. Vous venez de créer un nouveau tableau vide sans rapport avec le flux autre que la longueur. De plus, vous n'avez pas réellement besoin du flux. Vous obtenez le tableau d'octets de la base de données convertissez-le en flux puis convertissez-le en tableau d'octets. Utilisez simplement le tableau d'octets. – Stilgar

Questions connexes