ASP.NET MVC: загрузка изображений из базы данных и отображение их в поле зрения - PullRequest
9 голосов
/ 10 ноября 2010

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

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

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

код вview:

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

Второй способ - использовать HttpHandler:

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

и код в представлении:

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

ПервыйВопрос в том, что является наиболее эффективным (работает быстрее) способом реализации этой функциональности (и почему он работает быстрее)?
И второй вопрос - существует ли способ непосредственного отображения изображения в нашем представлении, когда мы впервые вызываемметод действия, чтобы вернуть это представление?Я имею в виду, что в методе действия мы получаем список изображений из базы данных и передаем их в виде списка, и используем этот код:

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

, этот код должен отображать изображение непосредственно из модели.

1 Ответ

6 голосов
/ 10 ноября 2010

Не будет большой разницы в производительности между этими двумя методами. Очевидно, что использование обработчика http будет самым быстрым, что вы можете получить, потому что запрос не проходит жизненный цикл MVC (маршрутизация, создание экземпляра контроллера, привязка модели, вызов действия), но я думаю, что это микрооптимизация, и я бы лично использовал первый подход, поскольку он более адаптирован в сценарии MVC. Если вы позже поймете, что это узкое место для вашего приложения, выполнив обширные нагрузочные тесты, вы всегда можете переключиться на подход http-обработчика.

Что касается вашего второго вопроса о помощнике, ответ - нет, вы не можете сделать это легко. Единственная возможность - использовать схему URI данных , но это поддерживается не всеми браузерами. Таким образом, если ваша модель имеет байтовый массив изображения, вы можете написать помощник, который выдает следующее:

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

Данные изображения в формате base64 кодируются непосредственно на странице. Другим недостатком является то, что эти изображения никогда не будут кэшироваться, и ваши HTML-страницы могут стать очень большими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...