2010-11-10 6 views
9

Wir haben ein paar Bilder in unserer Datenbank und möchten deren in Sicht anzeigen. Ich finde Zweiweg, dies zu tun - die ersten: Wir Aktionsmethode in Controller zu erstellen, die ein Bild aus der Datenbank erhalten und zurück Filecontentresult:ASP.NET MVC: Laden von Bildern aus der Datenbank und Anzeigen ihrer in Sicht

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

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

Code im Blick:

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

Der zweite Weg ist zu verwenden HttpHandler:

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

und Code im Blick:

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

Die erste Frage, was ist der effizienteste (Arbeit schneller) Weg, um diese Funktionalität zu implementieren (und warum es schneller arbeiten)?
Und die zweite Frage - gibt es eine Möglichkeit, Bild direkt in unsere Sicht zu setzen, wenn wir zuerst Aktionsmethode aufrufen, um diese Ansicht zurückzugeben? Ich meine, dass wir die Liste der Bilder aus der Datenbank in Aktion-Methode erhalten und ihre als Liste in Sicht passieren, und im Hinblick auf die Verwendung diesen Code:

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

dass Codebild in den Blick vom Modell direkt setzen müssen.

+0

Denken Sie darüber nach, Bilddateien außerhalb der db abzulegen? –

+0

Ja, ich habe die meisten Bilder im Dateisystem gespeichert, aber ich war an der oben beschriebenen Lösung interessiert. – Kai

Antwort

6

Es wird keinen großen Unterschied in der Leistung zwischen den beiden Methoden geben. Offensichtlich ist die Verwendung eines http-Handlers der schnellste, den Sie erhalten könnten, da die Anfrage nicht den MVC-Lebenszyklus durchläuft (Routing, Instanziierung eines Controllers, Modellbindung, Aufruf der Aktion), aber ich denke, dies ist eine Mikrooptimierung und würde ich persönlich verwenden der erste Ansatz, da es in einem MVC-Szenario besser angepasst ist. Wenn Sie später feststellen, dass dies ein Engpass für Ihre Anwendung ist, indem Sie umfangreiche Belastungstests durchführen, können Sie immer zum http-Handler-Ansatz wechseln.

Soweit Ihre zweite Frage betrifft den Helfer, ist die Antwort nein, Sie können dies nicht leicht tun. Die einzige Möglichkeit besteht darin, die data URI scheme zu verwenden, aber dies wird nicht von allen Browsern unterstützt. Auf diese Weise, wenn Ihr Modell das Byte-Array des Bildes hat könnte man einen Helfer schreiben, die die folgenden macht:

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

Die Bilddaten base64 direkt in die Seite verschlüsselt ist. Ein weiterer Nachteil ist, dass diese Bilder niemals zwischengespeichert werden und Ihre HTML-Seiten sehr groß werden können.

Verwandte Themen