2011-09-26 13 views
36

Używam EF 4.1 Kod Najpierw i dla uproszczenia załóżmy, że mam następujące klasy jednostki:Konwersja Byte Array do obrazu i wyświetlić w Razor View

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Byte[] Image { get; set; } 
} 

udało mi się stworzyć działający widok Utwórz, który umożliwia dodanie obiektu osoby do bazy danych.

Ale kiedy przyjdzie, aby wyświetlić szczegóły dla osoby, ja utknąć na wyświetlanie obrazu. Po przeszukaniu Google przez wiele godzin, mam następujące:

// To convert the Byte Array to the author Image 
public FileContentResult getImg(int id) 
{ 
    byte[] byteArray = DbContext.Persons.Find(id).Image; 
    return byteArray != null 
     ? new FileContentResult(byteArray, "image/jpeg") 
     : null; 
} 

A w widoku, w którym ja próbuje notować dane osoby, mam następujący aby uzyskać obraz na wyświetlaczu:

<img src="@Html.Action("getImg", "Person", new { id = item.Id })" alt="Person Image" /> 

Jednak powyższe jest nie działa, moje źródło obrazu [src] atrybut zwraca pusty.

Chciałbym bardzo doceniam pomoc z otrzymywaniem obrazów do wyświetlenia.

Dziękuję.

Ciwan.

Odpowiedz

35

Jak to:

<img src="@Url.Action("getImg", "Person", new { id = item.Id })" alt="Person Image" /> 

Trzeba Url.Action i nie Html.Action ponieważ po prostu chcesz wygenerować URL do akcji GetImg. Html.Action robi coś entirely different.

+2

Awesome, wydaje się działać teraz, ** Dziękuję Darin ** :) – Ciwan

+0

Ale co jeśli jest tablica bajtów jakiegoś pliku PDF. Jak wyświetlić link do podglądu lub link do pobrania pliku pdf. . – Unbreakable

+0

Co, jeśli to nie jest obraz. Jak możemy sobie z tym poradzić. Oczywiście nie możemy umieścić tagu img src dla pdf's – Unbreakable

54

Jest jeszcze łatwiejszy sposób to zrobić, jeśli już zdarzy się, że obraz załadowany modelu:

<img src="data:image;base64,@System.Convert.ToBase64String(Model.Image)" /> 

Robi w ten sposób nie trzeba iść do serwera ponownie po prostu pobrać obraz byte[] z bazy danych, tak jak Ty.

+0

To działa, ale jest limit 32 KB w IE8 – refactor

+0

Ale co to jest plik PDF lub plik tekstowy.Jak wyświetlić link może być podgląd treści w kodzie brzytwy. pod warunkiem, że w działaniu kontrolera mamy tablicę bajtów. – Unbreakable

0

Okazało się, że najlepszym sposobem wyświetlania dynamicznie załadowanego obrazu SVG z właściwości Model na stronie Razor MVC jest użycie Html.DisplayFor (..) w połączeniu z .ToHTMLString(). W moim przypadku, należy mieć podstawowy ciąg znaków danych SVG Image + XML przechowywany we właściwości modelu o nazwie Image. Tu jest mój kodu:

<img src='@Html.DisplayFor(model => model.Image).ToHtmlString()' /> 

Wydawało się, że jedynym sposobem udało mi się uzyskać obraz SVG, aby prawidłowo wyświetlić w Chrome, Firefox i IE.

Cheers