2011-12-16 6 views
6

Estoy tratando de mostrar una imagen que se extrae de la base de datos como una secuencia binaria, en el formulario web. ¿Puedes arrojar algo de luz sobre esto?mostrar una secuencia binaria recuperada de la base de datos como "imagen" dentro del html como una etiqueta <img>

Estoy trabajando en un proyecto donde los usuarios tienen perfiles, y cada usuario tiene su propia imagen de perfil que se muestra en la página de inicio. Esta imagen proviene de la base de datos.

aquí está el código que he usado para obtener la transmisión.

TestDBDataContext context1 = new TestDBDataContext(); 

      var r = (from a in context1.ImageTables where a.Id == 8 select a).First(); 

      MemoryStream stream = new MemoryStream(r.FileImage.ToArray()); 

gracias

Respuesta

4

Lo que he hecho en el pasado se establece la URL de la imagen a una página aspx, así:

<img src="getLogo.aspx" alt="Logo" /> 

Luego, en el código subyacente para getLogo.aspx, he hecho lo siguiente :

Response.BinaryWrite(imageData); 
Response.ContentType = "image/gif"; 

Dónde imageData es su imagen como una matriz de bytes

+0

que wud crea una publicación cada vez, ¡correcto! –

+1

No, no se envían datos a través de un POST. –

+0

gracias, esto es lo que estaba buscando! –

3

Me gustaría guardar la imagen en un directorio dentro del sitio web que sea accesible a los llamantes externos (es decir, un subdirectorio de imágenes) utilizando un nombre sin sentido (como la clave primaria del registro en el base de datos o un GUID), luego agregue un href a este archivo en la página web.

+0

gracias, pero si tuviera que hacer eso ¿por qué wud ahorré en la base de datos?Sé que es un enfoque de hacer eso, pero estoy buscando algo mejor, ¿alguna idea? –

+1

@ShaneAdrianMuaz: Algunas razones que puedo pensar: 1) Eventualmente puede tener múltiples servidores web, por lo que no tiene que coordinar archivos en cada uno; 2) Puede migrar a un nuevo servidor web o plataforma, por lo que una vez más, no es necesario administrar los archivos; vale la pena; 3) si las imágenes representan algo relacionado con el negocio, puede necesitar/querer representarlas en un cliente diferente, como Silverlight o una aplicación de tableta. –

+1

Sí, pero teniendo en cuenta todas esas razones (ya han decidido guardarlo en DB) ¿por qué tenerlo como un archivo en la raíz web? Eso es un poco raro. –

7

Base64 codificar su binario e insertar en una etiqueta de imagen de la siguiente manera (cambiar el tipo MIME para que se adapte):

<img src="data:image/gif;base64,BASE64 ENCODED BINARY HERE"> 

Ésta es la forma en que lo haría, pero no me gustaría hacer esto ya que algunos navegadores no pueden manejar es (IE6). Es mejor guardar primero en un archivo y hacerlo de la manera convencional.

+0

Veo, entonces, aparte de guardar la imagen y vincularla, ¿hay alguna otra forma de hacerlo? Por ejemplo, ¿puede estar usando un httphandler o algo? –

+1

Creo que DJ Quimby tiene el enfoque correcto, en PHP crearía un script que tomaría el nombre de la imagen como un parámetro de consulta, recuperaría el binario del almacén de datos y lo devolvería al navegador, configurando un encabezado de tipo de contenido con el tipo mimet correcto –

1

Almacenar memoria Corriente de presentar usando:

MemoryStream memoryStream = new MemoryStream(); 
    using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Write)) 
    { 
     memoryStream.SaveTo(fileStream); 
    } 

a continuación, poner el nombre de archivo en html.

+0

lo siento, pero no entiendo tu punto aquí, ¿puedes explicar un poco? –

1

en primer lugar tienen un archivo .aspx separada para la imagen (en realidad me favorezco una sobrecarga IHttpHandler para esto, pero el principio es el sam e e introduzcamos solo un nuevo concepto a la vez).

El archivo .aspx simplemente heredará del código subyacente y no tendrá contenido. Por lo tanto, tendría la directiva <%@ Page %> y nada más.

En el código subyacente, en el controlador de eventos page-load, obtenga la imagen y establezca el tipo de contenido de la respuesta en el valor apropiado (o si, por ejemplo, todas las imágenes son image/png, podría solo codifica eso). Luego escribe la imagen en la salida.

TestDBDataContext context1 = new TestDBDataContext(); 
int id; 
if(int.TryParse(Request.QueryString["id"], out id)) 
{ 
    var r = (from a in context1.ImageTables where a.Id == 8 select a).FirstOrDefault(); 
    if(r != null) 
    { 
    Response.ContentType = r.ContentType; 
    Response.BinaryWrite(r.FileImage.ToArray()); 
    return; 
    } 
} 
//code to handle 404 not found for no such image here (send error message or Server.Transfer to error page, etc. 

continuación, puede utilizar esto con <img src="profileImg.aspx?id=8" alt="" /> etc.

una mejora del rendimiento es la obtención de un trozo bytes 4k a la vez de la base de datos y escribirlos en Response.OutputStream, en lugar de una enorme diversidad en la memoria. Para archivos pequeños la diferencia no es importante, pero para archivos muy grandes puede ser considerable (como "¡hurra ahora mi servidor web no se cae una y otra vez!" Considerable).

+0

Si tuviera que hacer esto en un httphandler, ¿cuál sería la diferencia? –

+1

Es un poco más ligero y más limpio en el caso en el que simplemente estás haciendo una tarea simple en la respuesta. En realidad, las páginas aspx son todas implementaciones IHttpHandler de todos modos, con muchas otras funcionalidades útiles. Una vez que esté contento de que sepa cómo resolver su problema actual, le recomiendo que lo intente de la manera HttpHandler. Es muy probable que la primera vez parezca una complicación adicional, pero una vez que los haya usado, pueden parecer más simples en casos como este. –

+0

muchas gracias, esto realmente dura –

Cuestiones relacionadas