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

6voto

hmojica Punkte 553

Das hat bei mir funktioniert. Da ich die Bilder in einer SQL Server-Datenbank speichere.

    [HttpGet("/image/{uuid}")]
    public IActionResult GetImageFile(string uuid) {
        ActionResult actionResult = new NotFoundResult();
        var fileImage = _db.ImageFiles.Find(uuid);
        if (fileImage != null) {
            actionResult = new FileContentResult(fileImage.Data,
                fileImage.ContentType);
        }
        return actionResult;
    }

In dem obigen Ausschnitt _db.ImageFiles.Find(uuid) sucht nach dem Datensatz der Bilddatei in der Datenbank (EF-Kontext). Es gibt ein FileImage-Objekt zurück, das nur eine benutzerdefinierte Klasse ist, die ich für das Modell erstellt habe, und verwendet es dann als FileContentResult.

public class FileImage {
   public string Uuid { get; set; }
   public byte[] Data { get; set; }
   public string ContentType { get; set; }
}

5voto

Avinash Urs Punkte 61

Sie können Datei verwenden, um eine Datei wie Ansicht, Inhalt usw. zurückzugeben.

 public ActionResult PrintDocInfo(string Attachment)
            {
                string test = Attachment;
                if (test != string.Empty || test != "" || test != null)
                {
                    string filename = Attachment.Split('\\').Last();
                    string filepath = Attachment;
                    byte[] filedata = System.IO.File.ReadAllBytes(Attachment);
                    string contentType = MimeMapping.GetMimeMapping(Attachment);

                    System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
                    {
                        FileName = filename,
                        Inline = true,
                    };

                    Response.AppendHeader("Content-Disposition", cd.ToString());

                    return File(filedata, contentType);          
                }
                else { return Content("<h3> Patient Clinical Document Not Uploaded</h3>"); }

            }

0 Stimmen

String.Empty y "" sind (für diese Verwendung) identisch. Vorschlag: Ersetzen Sie diesen ganzen Test durch string.IsNullOrEmpty(test) oder vielleicht sogar string.IsNullOrWhitespace(test)

4voto

leppie Punkte 111830

Sehen Sie sich ContentResult an. Diese gibt eine Zeichenkette zurück, kann aber verwendet werden, um Ihre eigene BinaryResult-ähnliche Klasse zu erstellen.

3voto

if (!System.IO.File.Exists(filePath))
    return SomeHelper.EmptyImageResult(); // preventing JSON GET/POST exception
else
    return new FilePathResult(filePath, contentType);

SomeHelper.EmptyImageResult() sollte zurückkehren FileResult mit vorhandenem Bild (z. B. 1x1 transparent).

Dies ist der einfachste Weg, wenn Sie Dateien auf einem lokalen Laufwerk gespeichert haben. Wenn die Dateien byte[] ou stream - dann verwenden Sie FileContentResult ou FileStreamResult wie Dylan vorschlug.

3voto

Imran Punkte 164

Ja, Sie können Image zurückgeben

public ActionResult GetImage(string imageFileName)
{
    var path = Path.Combine(Server.MapPath("/Images"), imageFileName + ".jpg"); 
    return base.File(path, "image/jpeg");
}

(Bitte vergessen Sie nicht, dies als Antwort zu markieren)

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