Ayuda con Asp.net

Publicado en 'Programación' por joel094, 26 Jun 2015.





  1. joel094

    joel094 Miembro frecuente

    Registro:
    14 Oct 2012
    Mensajes:
    213
    Likes:
    7




    Buen dia a todos tengo un pequeño código que lo que hace es buscarme una imagen guardada en varbinary en mi base de datos transformarlo y mostrármelo en un Picturebox pero eso trabaja sobre App de escritorio necesito lo mismo pero para web aquí les dejo el código para escritorio, el problema es que en web no existe el picturebox solo existe el Image pero no cuenta con las mismas propiedades espero su ayuda gracias.

    Código:
    public void cargarimagen(String NOMBRE, PictureBox imagen)
        {
            conn = new SqlConnection(Conn);
            SqlCommand comando = new SqlCommand("select [IMAGEN] from ANIMALES where NOMBRE='" + NOMBRE.ToString() + "'", conn);
    
            SqlDataAdapter dp = new SqlDataAdapter(comando);
    
            DataSet ds = new DataSet("ANIMALES");
            dp.Fill(ds, "ANIMALES");
            conn.Open();
            SqlDataReader dx = comando.ExecuteReader();
    
            if (dx.Read())
            {
                byte[] datos = new byte[0];
                DataRow dr = ds.Tables["ANIMALES"].Rows[0];
                datos = (byte[])dr["IMAGEN"];
                System.IO.MemoryStream ms = new System.IO.MemoryStream(datos);
                imagen.Image = System.Drawing.Bitmap.FromStream(ms);
            }
     


  2. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Extrae la imagen a disco en una ruta de tu aplicación web, y solo generas el html con el tag de IMG apuntando a la url de la imagen.
     
  3. joel094

    joel094 Miembro frecuente

    Registro:
    14 Oct 2012
    Mensajes:
    213
    Likes:
    7
    si es una buena idea peor lo que pasa es que estas imagenes son guaradas por el mismo porgrama osea el usuario las sube les pone una descripcion y las guarda, esto funciona algo asi como un cliente-servidor.
     
  4. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    es igual:
    - lo mas simple , bajas de bd a disco la imagen y la muestras con tag img.
    - si no quieres archivo intermedio, tu memorystream conviertelo a outputstream en el response de una url, y esa url igualmente va a estar en un tag html img.
     
  5. AiApaec

    AiApaec Miembro frecuente

    Registro:
    1 May 2014
    Mensajes:
    58
    Likes:
    14
    La mejor opción me parece que es la segunda posteada por el usuario @gnox :
    -si no quieres archivo intermedio, tu memorystream conviertelo a outputstream en el response de una url, y esa url.
    Ya tienes el código hasta donde se obtiene el arreglo de bytes, después de eso es fácil, crea un httphandler (handler genérico, archivo .ashx) y retorna la imagen desde ese handler, el html luciría así:

    HTML:
    <img src='<%= ResolveClientUrl("~/") %>Handlers/ImageHandler.ashx?ImageId=12' alt='myImg' id="Img12" />
    Luego en tu proyecto crea el folder Handlers y dentro el handler genérico, en este el código sería +/- así:
    PHP:
    public void ProcessRequest(HttpContext context)
    {
        
    context.Response.ContentType "image/png";
        try
        {
        
    string imgId context.Request.QueryString["ImgId"];
        
    IImageResolver resolver ImageResolver();
        
    ImageData img resolver.GetImageDataById(imgId);
    //aqui deberìas valiar si img no es nulo...
            
    context.Response.BinaryWrite(ImageData.Bytes);
            
    context.Response.Flush();
        }
        catch (
    Exception ex)
        {
            
    context.Response.Write(ex);
        }
    }
    Fijate, imgId es enviado como queryString en el html (src de la imagen) y se captura en el handler. Hay 3 elementos nuevos, la interfaz IImageResolver y su implementación ImageResolver, con su mètodo GetImageDataById, en este método escribes el códio necesario para obtener desde donde sea la imagen, en tu caso desde la BD. También esta la clase ImageDataEste sería +/- el código:
    PHP:
    public class ImageData
    {
        public 
    string Name{get;set;}
        public 
    byte[] Bytes {get;set;}
    }

    public interface 
    IImageResolver
    {
        
    ImageData GetImageDataById(string imgId);
    }

    public class 
    ImageResolver IImageResolver
    {
        public 
    ImageData GetImageDataById(string imgId);
        {
            
    ImageData imgData null;
           
            try
            {
                
    conn = new SqlConnection(Conn);
                
    SqlCommand comando = new SqlCommand("select [IMAGEN] from ANIMALES where NOMBRE='" NOMBRE.ToString() + "'"conn);

                
    SqlDataAdapter dp = new SqlDataAdapter(comando);

                
    DataSet ds = new DataSet("ANIMALES");
                
    dp.Fill(ds"ANIMALES");
                
    conn.Open();
                
    SqlDataReader dx comando.ExecuteReader();

                if (
    dx.Read())
                {
                    
    imgData = new ImageData();
                    
    imgData.Name "Un nombre";
                    
    DataRow dr ds.Tables["ANIMALES"].Rows[0];
                    
    imgData.Bytes = (byte[])dr["IMAGEN"];           
                }
            }
            catch{throw;}   
           
            return 
    imgData;
        }
       
    }
    Es un código básico pero funcional, depende de ti investigar mejorarlo. Averigua sobre como cachear la imagen que devuelve el handler. Tambien tienes que agregar un queryString a la url del handler en el src de la imagen, sería un random para que el navegador no cachée....
    ...