Подтвердить что ты не робот

Отобразить изображение, содержащееся в байте [], с помощью ASP.Net MVC3

У меня есть вид с сильным типом. Этот сильный тип имеет поле, состоящее из байта [], этот массив содержит изображение.

Можно ли отобразить это изображение с помощью чего-то вроде @Html.Image(Model.myImage)?

Большое спасибо

4b9b3361

Ответ 1

Вы можете создать метод действия контроллера, который возвращает изображение как FileContentResult:

public FileContentResult Display(string id) {
   byte[] byteArray = GetImageFromDB(id);
   return new FileContentResult(byteArray, "image/jpeg");
}

Затем вы можете создать ActionLink для метода действия в представлении, используя идентификатор изображения из модели.

Ответ 2

Это зависит от того, насколько велико изображение. Если он мал, вы можете написать что-то на base-64, закодировать его и вставить в html, как любой из них.

Для конкретный пример отсюда:

<img src="data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPbWLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVrApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KTkpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxMAF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=" alt="British Blog Directory" width="80" height="15">

Если изображение имеет какой-либо заметный размер, вы можете вместо этого написать маршрут, который позволяет искать через какой-то ключ к изображению, т.е. маршрут, такой как /images/{id} - на этом маршруте вы извлекаете двоичный файл изображения и используете return File(bytes, contentType), дополнительно настраивая заголовки кеширования (и не забудьте повторно проверить любую необходимую безопасность). В вашем html вам просто будет

<img src="/images/@imageId" ... />

(используя синтаксис бритвы, но аналогичный для aspx).

Для отдельного подхода к маршруту требуется дополнительный перелет на сервер, но он позволяет кэшировать на клиенте (встроенный подход base-64 помещает данные в каждый запрос).

Ответ 3

Если у вас уже есть образ, загруженный в вашу модель в виде массива byte[], вы можете это сделать, поскольку @Marc Gravell упоминает в его ответ:

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

Это значительно упростит весь процесс, и вам не понадобится конкретный метод действий FileContentResult и снова удалите базу данных (см. @Dmitry S answer). просто чтобы получить этот массив byte[] с вашим изображением/фотографией, так как вы уже загрузили его в свою модель.

Ответ 4

Похоже, вам нужно новое действие, которое получает массив байтов (из базы данных?) и возвращает изображение через File метод....

Затем создайте привязку, указывающую на это действие, таким образом, изображение может быть загружено во время загрузки страницы, ускоряя отображение.

Ответ 6

Я бы разработал простой общий обработчик для обслуживания ваших изображений. Этот обработчик мог, учитывая некоторый параметр, загружать изображения из базы данных и записывать их в выходной поток http.

public class UserImage : IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/jpeg";

        // Get the stream from the database
        var image = System.Drawing.Image.FromStream(stream);

        image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    }
}