2012-09-25 15 views
10

Estoy tratando de crear una aplicación que muestre las imágenes que se almacenan localmente en el servidor web. Esto es lo que tengo en mi opinión, tenga en cuenta que "entrada" son direcciones absolutas como "C:\Images\Image1.jpg". Sin embargo, cuando lo ejecuto, obtengo "Not allowed to load local resource: file:///C:/Images/ImageName.jpg" en el registro de la consola. Entonces quizás intente acceder a la imagen en el cliente. ¿Cómo le digo a mi vista que acceda a la ruta del servidor web local y no busque el origen de la imagen en el cliente? Tenga en cuenta que mover las imágenes al directorio del proyecto no es una opción, porque las imágenes se almacenan en una unidad diferente en el servidor web.establecer propiedad src en vista de una url fuera del proyecto MVC3

<!-- 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> 

Respuesta

18

No puede enviar imágenes directamente fuera de su aplicación ASP.NET MVC 3 al cliente. Esa sería una gran vulnerabilidad de seguridad si el cliente pudiera acceder a archivos arbitrarios en su servidor.

Tendrá que escribir una acción del controlador que los devolverá y luego señalar su propiedad src de sus etiquetas <img> a esta acción del controlador.

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

y dentro de la vista:

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

También podría pasar el nombre de la imagen como parámetro a la acción del controlador:

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"); 
    } 
} 

y en su opinión:

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

Soy muy nuevo en MVC3, ¿qué aspecto tendría? – Alicester4WonderlandPresident

+0

Parecería una acción de controlador que devuelve un FileResult. Ver mi respuesta actualizada. –

+0

Funcionó como un amuleto, gracias. – Alicester4WonderlandPresident

0

El código anterior fue útil para mí, con un cambio como éste

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"); 

}

el archivo arrojado al usuario con el nombre del archivo es como este "archivo adjunto; filename = TableImportLog.csv", pero quiero que el nombre de archivo como "TableErrorLog.csv " necesita ayuda para lo mismo!

Cuestiones relacionadas