2013-11-23 11 views
19

attualmente ho una matrice di byte che rappresenta la mia immagine nel mio ViewModel. Io lo mostro con il seguente codice:ASP.NET Immagine MVC dall'array di byte

<img src="@String.Format("data:image/gif;base64,{0}", Convert.ToBase64String(Model.Image))" /> 

Ora io non voglio avere una stringa Base64 nel mio file di origine, ma piuttosto un link ad un'immagine. Ad esempio:

<img src="Images/" + Model.Id"/> 

che restituirebbe un'immagine.

Come si scrive un metodo per restituire un collegamento Immagine?

risposta

41

Si potrebbe definire un'azione di controllo che servirà l'immagine:

public class ImagesController: Controller 
{ 
    public ActionResult Index(int id) 
    { 
     byte[] imageData = ... go get your image data from the id 
     return File(imageData, "image/png"); // Might need to adjust the content type based on your actual image type 
    } 
} 

e nella vista semplicemente puntare la proprietà src del tag img a questa azione di controllo:

<img src="@Url.Action("Index", "Images", new { id = Model.Id })" /> 
+0

grazie. Funzionerà, accetterà la risposta il più presto possibile – Florian

+0

Il file generato è temporaneo? – notsoux

+2

@notsoux, non ci sono file coinvolti qui. Il server esegue lo streaming dei dati dal database direttamente al client senza creare alcun file. Spetta al cliente decidere cosa fare con questo flusso. –

9

Un modo è quello di aggiungere questo a un nuovo C# classe o HtmlExtensionsclass

public static class HtmlExtensions 
{ 
    public static MvcHtmlString Image(this HtmlHelper html, byte[] image) 
    { 
     var img = String.Format("data:image/jpg;base64,{0}", Convert.ToBase64String(image)); 
     return new MvcHtmlString("<img src='" + img + "' />"); 
    } 
} 

quindi è possibile farlo in qualsiasi vista

@Html.Image(Model.MyImageBytes)