2013-11-23 17 views
19

hiện tại tôi có một mảng byte biểu diễn Hình ảnh của tôi trong ViewModel của tôi. Tôi hiển thị nó với mã sau:Hình ảnh MVC ASP.NET từ mảng byte

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

Bây giờ tôi không muốn có chuỗi Base64 trong tệp nguồn, mà là một liên kết tới hình ảnh. Giống như:

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

sẽ trả về hình ảnh.

Làm cách nào để viết phương thức như vậy để trả về liên kết Hình ảnh?

Trả lời

41

Bạn có thể xác định một hành động điều khiển sẽ phân phối hình ảnh:

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 
    } 
} 

và theo quan điểm của bạn chỉ đơn giản là trỏ src sở hữu của thẻ img để controller action này:

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

cảm ơn. Nó hoạt động, sẽ chấp nhận câu trả lời càng sớm càng tốt – Florian

+0

Tệp được tạo là tạm thời? – notsoux

+2

@notsoux, không có tệp nào tham gia ở đây. Máy chủ đang truyền trực tuyến dữ liệu từ cơ sở dữ liệu trực tiếp đến máy khách mà không cần tạo bất kỳ tệp nào. Tùy thuộc vào khách hàng để quyết định xem phải làm gì với luồng này. –

9

Một cách là thêm mục này vào một lớp C# mới hoặc 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 + "' />"); 
    } 
} 

thì bạn có thể thực hiện việc này ở bất kỳ chế độ xem nào

@Html.Image(Model.MyImageBytes) 
Các vấn đề liên quan