2010-11-10 13 views
9

Tenemos algunas imágenes en nuestra base de datos y queremos mostrarlas a la vista. Encuentro bidireccional para hacer esto - la primera: creamos método de acción en el controlador que obtener una imagen de la base de datos y volver FileContentResult:ASP.NET MVC: cargando imágenes de la base de datos y mostrando su en vista

public ActionResult GetImage(int id) 
    { 
     var imageData = ...get bytes from database... 

     return File(imageData, "image/jpg"); 
    } 

código en la vista:

<img src='<%= Url.Action("GetImage", "image", new { id = ViewData["imageID"] }) %>' /> 

La segunda forma de es usar HttpHandler:

public void ProcessRequest(HttpContext Context) 
    { 
     byte [] b = your image...; 
     Context.Response.ContentType = "image/jpeg"; 
     Context.Response.BinaryWrite(b); 
    } 

y código en la vista:

<img src="AlbumArt.ashx?imageId=1" /> 

La primera pregunta es ¿cuál es el más eficiente (un trabajo más rápido) forma de implementar esta funcionalidad (y por qué trabajar más rápido)?
Y la segunda pregunta: ¿hay alguna manera de poner la imagen en nuestra vista directamente, cuando llamamos por primera vez al método de acción para devolver esta vista? Me refiero a que en el método de acción que obtenemos lista de imágenes a partir de la base de datos y transmitir su en ver como listado, y teniendo en cuenta el uso de este código:

<%=Html.Image(Model[i])%> 

que el código debe poner imagen a la vista directamente de modelo.

+0

¿Considera que debe colocar archivos de imágenes fuera del DB? –

+0

Sí, coloqué la mayoría de las imágenes en el sistema de archivos, pero estaba interesado en la solución descrita anteriormente. – Kai

Respuesta

6

No habrá mucha diferencia en el rendimiento entre los dos métodos. Obviamente, usar un manejador de http será lo más rápido posible porque la solicitud no pasa por el ciclo de vida de MVC (enrutamiento, creación de instancias de un controlador, enlace de modelo, invocación de la acción) pero creo que esto es una micro optimización y yo personalmente usaría el primer enfoque ya que está más adaptado en un escenario MVC. Si luego se da cuenta de que esto es un cuello de botella para su aplicación al realizar pruebas de carga extensas, siempre puede cambiar al enfoque del controlador http.

En lo que respecta a su segunda pregunta sobre el asistente, la respuesta es no, no puede hacerlo fácilmente. La única posibilidad es usar el data URI scheme, pero esto no es compatible con todos los navegadores. De esta manera si el modelo tiene la matriz de bytes de la imagen que podría escribir un ayudante que hace lo siguiente:

<img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAA..." alt="Red dot" /> 

Los datos de imagen es codificada en base64 directamente en la página. Otro inconveniente es que esas imágenes nunca se almacenarán en caché y sus páginas HTML podrían llegar a ser muy grandes.

Cuestiones relacionadas