2012-09-25 2 views
10

Ich versuche, eine Anwendung zu erstellen, die Bilder anzeigt, die lokal auf dem Webserver gespeichert sind. Hier ist, was ich aus meiner Sicht habe, beachten Sie, dass "Eintrag" absolute Adressen wie "C:\Images\Image1.jpg" sind. Wenn ich es jedoch ausführe, erhalte ich "Not allowed to load local resource: file:///C:/Images/ImageName.jpg" im Konsolenprotokoll. Vielleicht versucht es, auf das Image des Clients zuzugreifen. Wie kann ich meiner Ansicht mitteilen, auf den lokalen Webserverpfad zuzugreifen und nicht nach der Bildquelle auf dem Client zu suchen? Bitte beachten Sie, dass das Verschieben der Bilder in das Projektverzeichnis keine Option ist, da die Bilder auf einem anderen Laufwerk auf dem Webserver gespeichert sind.set src property in Bezug auf eine URL außerhalb des MVC3-Projekts

<!-- language: c# --> 
@model List<String> 
<div style="height: 500px; overflow:scroll;"> 
<h2> 
    ScreenShots for testMachine</h2> 

@foreach (var entry in Model) 
{   
    <div class="nailthumb-container square-thumb"> 
    <img alt="screenshot" src="@Url.Content(entry)" /> 

</div> 
} 
</div> 

Antwort

18

Sie können Bilder nicht direkt außerhalb Ihrer ASP.NET MVC 3-Anwendung an den Client liefern. Das wäre eine große Sicherheitslücke, wenn der Client auf beliebige Dateien auf Ihrem Server zugreifen könnte.

Sie müssen eine Controller-Aktion schreiben, die sie zurückgibt, und dann Ihre src-Eigenschaft Ihrer <img>-Tags auf diese Controller-Aktion zeigen.

public class ImagesController: Controller 
{ 
    public ActionResult SomeImage() 
    { 
     return File(@"C:\Images\foo.jpg", "image/jpeg"); 
    } 
} 

und innerhalb Ihrer Ansicht:

public class ImagesController: Controller 
{ 
    public ActionResult SomeImage(string imageName) 
    { 
     var root = @"C:\Images\"; 
     var path = Path.Combine(root, imageName); 
     path = Path.GetFullPath(path); 
     if (!path.StartsWith(root)) 
     { 
      // Ensure that we are serving file only inside the root folder 
      // and block requests outside like "../web.config" 
      throw new HttpException(403, "Forbidden"); 
     } 

     return File(path, "image/jpeg"); 
    } 
} 

und in der Ansicht:

<img src="@Url.Action("SomeImage", "Images", new { image = "foo.jpg" })" alt="" /> 

<img src="@Url.Action("SomeImage", "Images")" alt="" /> 

Sie auch die Bildnamen als Parameter an die Controller-Aktion passieren könnten

+0

Ich bin sehr neu in MVC3, wie würde das aussehen? – Alicester4WonderlandPresident

+0

Es würde wie eine Controller-Aktion aussehen, die ein FileResult zurückgibt. Siehe meine aktualisierte Antwort. –

+0

Es hat wie ein Zauber funktioniert, danke. – Alicester4WonderlandPresident

0

Der obige Code war nützlich für mich, mit einer Änderung wie diese

System.Web.UI.Page page = new System.Web.UI.Page(); 
string filePath = page.Server.MapPath("~/Log/" + fileName); 

     if (!filePath.StartsWith(filePath)) 

     { 

      throw new HttpException(403, "Forbidden"); 
     } 

     return File(filePath, "Content-Disposition", "attachment;filename=TableImportLog.csv"); 

}

die Datei an den Benutzer ausgelöst wird, mit Dateinamen wie dieses „attachment; filename = TableImportLog.csv“, aber ich mag die Dateinamen als „TableErrorLog.csv " brauche Hilfe für das gleiche!

Verwandte Themen