483 Stimmen

Kann ein ASP.NET MVC-Controller ein Bild zurückgeben?

Kann ich einen Controller erstellen, der einfach ein Bild-Asset zurückgibt?

Ich möchte diese Logik durch einen Controller leiten, wenn eine URL wie die folgende angefordert wird:

www.mywebsite.com/resource/image/topbanner

Der Controller sucht nach topbanner.png und senden dieses Bild direkt an den Kunden zurück.

Ich habe Beispiele gesehen, bei denen man eine Ansicht erstellen muss - ich möchte keine Ansicht verwenden. Ich möchte das alles nur mit dem Controller machen.

Ist dies möglich?

1 Stimmen

Ich habe eine ähnliche Frage hier gestellt https://stackoverflow.com/questions/155906/creating-a-private-photo-gallery-using-aspnet-mvc und fand schließlich einen tollen Leitfaden für diese Aufgabe. Ich habe eine ImageResult-Klasse nach diesem Leitfaden erstellt. https://blog.maartenballiauw.be/post/2008/05/13/aspnet-mvc-custom-actionresult.html

2 Stimmen

Wenn Sie das Bild verändern wollen, das ImageResizing.Net HttpModul verwenden um die beste Leistung zu erzielen. Wenn Sie das nicht tun, fügt ein FilePathResult nur ein paar Prozent des Overheads hinzu. URL-Rewriting fügt etwas weniger hinzu.

1 Stimmen

Warum nicht mit WebApi Controller statt MVC? ApiController class

2voto

Franci Penov Punkte 73239

Sie könnten die HttpContext.Response verwenden und den Inhalt direkt in sie schreiben (WriteFile() könnte für Sie funktionieren) und dann ContentResult von Ihrer Aktion anstelle von ActionResult zurückgeben.

Haftungsausschluss: Ich habe dies nicht ausprobiert, es basiert auf der Betrachtung der verfügbaren APIs :-)

1 Stimmen

Ja, ich habe gerade bemerkt, ContentResult unterstützt nur Strings, aber es ist einfach genug, um Ihre eigenen ActionResult basierte Klasse zu machen.

2voto

Ich bin auch auf eine ähnliche Anforderung gestoßen,

In meinem Fall stelle ich also eine Anfrage an Controller mit dem Pfad des Bildordners, der im Gegenzug ein ImageResult-Objekt zurücksendet.

Der folgende Codeschnipsel veranschaulicht die Arbeit:

var src = string.Format("/GenericGrid.mvc/DocumentPreviewImageLink?fullpath={0}&routingId={1}&siteCode={2}", fullFilePath, metaInfo.RoutingId, da.SiteCode);

                if (enlarged)
                    result = "<a class='thumbnail' href='#thumb'>" +
                        "<img src='" + src + "' height='66px' border='0' />" +
                        "<span><img src='" + src + "' /></span>" +
                        "</a>";
                else
                    result = "<span><img src='" + src + "' height='150px' border='0' /></span>";

Und im Controller erzeuge ich aus dem Bildpfad das Bild und gebe es an den Aufrufer zurück

try
{
  var file = new FileInfo(fullpath);
  if (!file.Exists)
     return string.Empty;

  var image = new WebImage(fullpath);
  return new ImageResult(new MemoryStream(image.GetBytes()), "image/jpg");

}
catch(Exception ex)
{
  return "File Error : "+ex.ToString();
}

2voto

Matt Mitchell Punkte 39413

Ich sehe zwei Möglichkeiten:

1) Implementieren Sie Ihre eigene IViewEngine und setzen Sie die ViewEngine-Eigenschaft des Controllers, den Sie verwenden, auf Ihre ImageViewEngine in der gewünschten "image"-Methode.

2) Verwenden Sie eine Ansicht :-). Ändern Sie einfach den Inhaltstyp usw.

1 Stimmen

Dies könnte auf zusätzliche Leerzeichen oder CRLFs in der Ansicht zurückzuführen sein.

2 Stimmen

Ich habe mich in meinem letzten Beitrag geirrt... msdn.microsoft.com/de-us/library/ Sie können die WebImage-Klasse und WebImage.Write in einer Ansicht verwenden :)

2voto

mekb Punkte 487

Lesen Sie das Bild, konvertieren Sie es in byte[] zurück, dann ein File() mit einem Inhaltstyp.

public ActionResult ImageResult(Image image, ImageFormat format, string contentType) {
  using (var stream = new MemoryStream())
    {
      image.Save(stream, format);
      return File(stream.ToArray(), contentType);
    }
  }
}

Hier sind die Verwendungszwecke:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Microsoft.AspNetCore.Mvc;

1voto

Ben Punkte 389

Von einem byte[] unter Core 3.2, können Sie verwenden:

public ActionResult Img(int? id) {
    MemoryStream ms = new MemoryStream(GetBytes(id));
    return new FileStreamResult(ms, "image/png");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X