2011-09-04 11 views
5

Soy nuevo en mvc y tengo un problema. Busqué una respuesta y no pude encontrar ninguna, pero estoy seguro de que algo me saltó. El problema es que no sé cómo acceder a un archivo después de subirlo a la carpeta App_Data. Yo uso el mismo código que he encontrado en todos los foros:¿Cómo ver un archivo después de cargarlo en App_Data/Uploads en MVC 3 con Razor?

Para mi punto de vista utilizo este

@using (Html.BeginForm("Index", "Home", FormMethod.Post, 
new { enctype="multipart/form-data" })) 
{ 
<input type="file" name="file" /> 
<input type="submit" value="submit" /> 
} 

Para mi regulador del uso este

public class HomeController : Controller 
{ 
// This action renders the form 
public ActionResult Index() 
{ 
    return View(); 
} 

// This action handles the form POST and the upload 
[HttpPost] 
public ActionResult Index(HttpPostedFileBase file) 
{ 
    // Verify that the user selected a file 
    if (file != null && file.ContentLength > 0) 
    { 
     // extract only the fielname 
     var fileName = Path.GetFileName(file.FileName); 
     // store the file inside ~/App_Data/uploads folder 
     var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
     file.SaveAs(path); 
    } 
    // redirect back to the index action to show the form once again 
    return RedirectToAction("Index");   
    } 
} 

Mi modelo es

public class FileDescription 
{ 
    public int FileDescriptionId { get; set; } 
    public string Name { get; set; } 
    public string WebPath { get; set; } 
    public long Size { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

El asunto es que quiero subir un archivo a la base de datos, y luego el WebPath para ser el enlace a mi archivo. Espero haber sido lo suficientemente claro. Cualquier ayuda sería realmente apreciada. Gracias

+0

quiero mi base de datos para que sólo permanezca la ruta al archivo, no el propio archivo. – Robert

+0

¿Podría definir lo que quiere decir con "ver un archivo", desea mostrarlo como un enlace o desea mostrar el contenido real del archivo? –

Respuesta

10

Puede acceder a su lado del servidor de archivos (por lo que para acceder a su contenido desde la aplicación ASP.NET) - sólo tiene que utilizar Server.MapPath("~/App_Data/uploads/<yourFileName>") para obtener la ruta absoluta (por ejemplo, C:./Inetpub/wwwroot/MyApp/add_data/MiArchivo .TXT).

El contenido de la carpeta App_Data no se puede acceder directamente al por URL por razones de seguridad. Todas las configuraciones, las bases de datos se almacenan allí, por lo que es bastante obvio por qué. Si necesita que su archivo subido sea accesible por URL, cárguelo en otra carpeta.

Supongo que necesita ese archivo para ser accesible a través de la web. En tal caso, la solución más fácil sería mantener un nombre de archivo (o una ruta absoluta completa como se mencionó al principio) a su archivo en una base de datos y crear una acción de controlador que tomaría un nombre de archivo y devolvería el contenido de su archivo.

0

Debe utilizar un controlador genérico para acceder a los archivos. IMO almacenar las imágenes/archivos en la carpeta App_Data es la mejor práctica, ya que no está publicando los archivos de forma predeterminada.

Por supuesto, depende de sus necesidades. Si no le importa en absoluto quién puede acceder a las imágenes, simplemente cárguelas en una carpeta fuera de la carpeta app_data :)

Todo depende de sus necesidades.

8

En caso de que ayuda a nadie, aquí está un ejemplo sencillo de un archivo PDF:

public ActionResult DownloadPDF(string fileName) 
{ 
    string path = Server.MapPath(String.Format("~/App_Data/uploads/{0}",fileName)); 
    if (System.IO.File.Exists(path)) 
    { 
     return File(path, "application/pdf"); 
    } 
    return HttpNotFound(); 
} 
Cuestiones relacionadas