2011-09-04 14 views
5

Sono nuovo di mvc e sono bloccato con un problema. Ho cercato dappertutto una risposta e non sono riuscita a trovarne una, ma sono sicuro che qualcosa mi ha saltato. Il problema è che non so come accedere ad un file dopo averlo caricato nella cartella App_Data. Io uso lo stesso codice che ho trovato su tutti i forum:Come visualizzare un file dopo averlo caricato su App_Data/Upload in MVC 3 con Razor?

Per mio punto di vista io uso questo

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

Per il mio controller io uso questo

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

Il mio modello è

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

Il fatto è che voglio caricare un file nel database e quindi il WebPath come collegamento al mio file. Spero di essere stato abbastanza chiaro. Qualsiasi aiuto sarebbe molto apprezzato. Grazie

+0

voglio che la mia base di dati per mantenere solo il percorso del file, non il file stesso. – Robert

+0

Puoi definire cosa intendi per "visualizzare un file", vuoi visualizzarlo come link o vuoi visualizzare il contenuto reale del file? –

risposta

10

Puoi accedere al tuo lato server di file (si fa per accedere al suo contenuto da un'applicazione ASP.NET) - basta usare Server.MapPath("~/App_Data/uploads/<yourFileName>") per ottenere il percorso assoluto (ad es. C:/inetpub/wwwroot/frontend/add_data/MyFile .testo).

contenuto della cartella App_Data non sono direttamente accessibili dal URL per motivi di sicurezza. Tutte le configurazioni, i database sono memorizzati lì, quindi è piuttosto ovvio perché. Se hai bisogno che il tuo file caricato sia accessibile tramite URL, caricalo in un'altra cartella.

Immagino che sia necessario che il file sia accessibile via web. In tal caso, la soluzione più semplice sarebbe quella di mantenere un nome file (o il percorso assoluto completo come menzionato all'inizio) nel file in un database e creare un'azione del controllore che prenda un nome file e restituisca il contenuto del file.

0

È necessario utilizzare un gestore generico per accedere ai file. IMO memorizzare le immagini/file nella cartella App_Data è la migliore pratica, in quanto non serve i file per impostazione predefinita.

Naturalmente dipende dalle vostre esigenze. Se non ti interessa affatto chi può accedere alle immagini, devi semplicemente caricarle in una cartella esterna alla cartella app_data :)

Tutto dipende dalle tue esigenze.

8

In caso aiuta nessuno, ecco un semplice esempio per un 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(); 
} 
Problemi correlati