MVC, как обслуживать изображения в ответном потоке
В моем контроллере я извлекаю список продуктов вместе с именем изображения, затем уменьшаю изображение до размера, необходимого представлению. Изображения находятся в памяти и готовы к записи в поток ответов. Я знаю, что клиент отправит ответ для каждого изображения, но я не знаю, как подключиться к нему, чтобы предоставить изображение.
Посмотреть код:
@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 ответа
Получить ссылку "Маршрут / действие" на новое действие, которое загружает изображение, чтобы установить в качестве 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 - двоичный контент или ссылка на поток
Хорошо, наконец, понял это благодаря 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;
}