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

12voto

JustinStolle Punkte 3872

Warum verwenden Sie nicht einfach die Tilde ~ Betreiber?

public FileResult TopBanner() {
  return File("~/Content/images/topbanner.png", "image/png");
}

11voto

JarrettV Punkte 18625

Sie können direkt in die Antwort schreiben, aber dann ist sie nicht testbar. Es ist vorzuziehen, ein ActionResult zurückzugeben, dessen Ausführung aufgeschoben ist. Hier ist mein wiederverwendbares StreamResult:

public class StreamResult : ViewResult
{
    public Stream Stream { get; set; }
    public string ContentType { get; set; }
    public string ETag { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = ContentType;
        if (ETag != null) context.HttpContext.Response.AddHeader("ETag", ETag);
        const int size = 4096;
        byte[] bytes = new byte[size];
        int numBytes;
        while ((numBytes = Stream.Read(bytes, 0, size)) > 0)
            context.HttpContext.Response.OutputStream.Write(bytes, 0, numBytes);
    }
}

8voto

Youngjae Punkte 22832

Der nachstehende Code verwendet System.Drawing.Bitmap um das Bild zu laden.

using System.Drawing;
using System.Drawing.Imaging;

public IActionResult Get()
{
    string filename = "Image/test.jpg";
    var bitmap = new Bitmap(filename);

    var ms = new System.IO.MemoryStream();
    bitmap.Save(ms, ImageFormat.Jpeg);
    ms.Position = 0;
    return new FileStreamResult(ms, "image/jpeg");
}

0 Stimmen

Hier wird der Dateiname festgelegt.

7voto

Ian Suttle Punkte 3344

UPDATE: Es gibt bessere Möglichkeiten als meine ursprüngliche Antwort. Dies funktioniert außerhalb von MVC ganz gut, aber es ist besser, mit den eingebauten Methoden der Rückgabe von Bildinhalten bleiben. Siehe hochgestimmte Antworten.

Natürlich können Sie das. Probieren Sie diese Schritte aus:

  1. Laden des Bildes von der Festplatte in ein Byte-Array
  2. das Bild zwischenspeichern, falls Sie mehr Anfragen für das Bild erwarten und die Festplattenein- und -ausgabe nicht wünschen (in meinem Beispiel unten wird es nicht zwischengespeichert)
  3. Ändern Sie den Mime-Typ über den Response.ContentType
  4. Response.BinaryWrite gibt das Byte-Array des Bildes aus

Hier ist ein Beispielcode:

string pathToFile = @"C:\Documents and Settings\some_path.jpg";
byte[] imageData = File.ReadAllBytes(pathToFile);
Response.ContentType = "image/jpg";
Response.BinaryWrite(imageData);

Ich hoffe, das hilft!

4 Stimmen

Und wie würde dies in der Aktion des Controllers aussehen?

7voto

Ajay Kelkar Punkte 4311

Lösung 1: So rendern Sie ein Bild in einer Ansicht aus einer Bild-URL

Sie können Ihre eigene Erweiterungsmethode erstellen:

public static MvcHtmlString Image(this HtmlHelper helper,string imageUrl)
{
   string tag = "<img src='{0}'/>";
   tag = string.Format(tag,imageUrl);
   return MvcHtmlString.Create(tag);
}

Dann verwenden Sie es so:

@Html.Image(@Model.ImagePath);

Lösung 2: Bild aus der Datenbank rendern

Erstellen Sie eine Controller-Methode, die Bilddaten wie folgt zurückgibt

public sealed class ImageController : Controller
{
  public ActionResult View(string id)
  {
    var image = _images.LoadImage(id); //Pull image from the database.
    if (image == null) 
      return HttpNotFound();
    return File(image.Data, image.Mime);
  }
}

Und verwenden Sie es in einer Ansicht wie:

@ { Html.RenderAction("View","Image",new {id=@Model.ImageId})}

Um ein von diesem Aktionsergebnis gerendertes Bild in einer beliebigen HTML-Datei zu verwenden, verwenden Sie

<img src="http://something.com/image/view?id={imageid}>

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