2010-11-10 10 views
9

Abbiamo alcune immagini nel nostro database e vogliamo visualizzarle in vista. Trovo due vie per fare questo - la prima: creiamo metodo di azione nel controller che ottiene un'immagine dal database e tornare FileContentResult:ASP.NET MVC: caricamento delle immagini dal database e visualizzazione delle loro viste

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

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

codice nella visualizzazione:

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

Il secondo modo è utilizzare HttpHandler:

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

e il codice nella visualizzazione:

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

La prima domanda è che cosa è il più efficiente (il lavoro più veloce) modo per implementare questa funzionalità (e perché lavorare più velocemente)?
E la seconda domanda: c'è un modo per mettere direttamente l'immagine nella nostra vista, quando prima chiamiamo il metodo azione per restituire questa vista? Voglio dire che nel metodo di azione si ottiene l'elenco delle immagini dal database e passare il loro a Vedi l'elenco, e in uso vista di questo codice:

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

che il codice deve mettere immagine in vista direttamente dal modello.

+0

Si considera di mettere i file di immagini al di fuori del db? –

+0

Sì, ho inserito la maggior parte delle immagini nel file system, ma ero interessato alla soluzione sopra descritta. – Kai

risposta

6

Non ci saranno molte differenze nelle prestazioni tra i due metodi. Ovviamente l'uso di un gestore HTTP sarà il più veloce che si possa ottenere perché la richiesta non passa attraverso il ciclo di vita di MVC (instradamento, istanziazione di un controller, associazione del modello, invocazione dell'azione) ma penso che si tratti di un'ottimizzazione e io personalmente utilizzerei il primo approccio in quanto è più adatto in uno scenario MVC. Se in seguito ti rendi conto che questo è un collo di bottiglia per l'applicazione eseguendo estesi test di carico, potresti sempre passare all'approccio del gestore HTTP.

Per quanto riguarda la seconda domanda relativa all'aiutante, la risposta è no, non è possibile farlo facilmente. L'unica possibilità è usare lo data URI scheme ma questo non è supportato da tutti i browser. In questo modo se il vostro modello ha la matrice di byte dell'immagine si potrebbe scrivere un aiutante che rende il seguente:

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

I dati immagine è Base64 codificato direttamente nella pagina. Un altro svantaggio è che quelle immagini non verranno mai memorizzate nella cache e le pagine HTML potrebbero diventare molto grandi.

Problemi correlati