MVC, как обслуживать изображения в ответном потоке - PullRequest
3 голосов
/ 25 июня 2011

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

Просмотр кода:

    @foreach (var product in Model.Products)
    {
       @product.Name
       <img src="@product.Thumbnail"/>
       Priced From $@product.LowestPrice
    }

Контроллер:

    model.Products =
       DataContext.Products.Where(p => p.Category.Name
            .Equals(id)).Select(m => new ProductListItem
                {
                   Name = m.Name,
                   Thumbnail = ImageResizer.Resize(m.Image, 75, 100, <normally I put the output stream here>),
                   LowestPrice = SqlFunctions.StringConvert( m.PriceSet.Prices.Min(p =>p.Price1))
                }
    );

Где подпись ImageResizer.Resize () равна

Resize(string imageName, int width, int height, Stream outputStream)

Так что мой вопрос, я думаю, должен заключаться в том, что я должен указать для имени изображения и как мне прослушивать запросы для каждого изображения, которое может быть записано в поток?

Ответы [ 2 ]

4 голосов
/ 25 июня 2011

Получить ссылку «Маршрут / действие» на новое действие, которое загружает изображение для установки в качестве URL-адреса изображения,

<img src='@Url.RouteUrl("Full", new { action = "Image", controller = "Media", number = product.id })' />

или

<img src='@Url.Action("Image", new { number = 3 })' />

Добавить новое действие, которое имеет что-то вроде

public ActionResult Image(int? number)
{
    var media = mr.GetMedia(number);

    return base.File(media.Content, media.ContentType ?? "image/jpeg");
}

где media.Content - двоичный контент или ссылка на поток

3 голосов
/ 25 июня 2011

Хорошо, наконец, понял это благодаря DanNsk и этот пост здесь

public FileResult Image(string id)
{
    var dir = Server.MapPath("/content/images");
    var path = Path.Combine(dir, id);

    var stream = XTC.Helpers.ImageResizer.Resize( path, 150, 200);
    var result = new FileStreamResult(stream, "image/jpeg");

    return result;
}
...