Gestire l'upload dei file con ASP.NET MVC 2

di Gianluca Esposito, in ASP.NET 4.0, ASP.NET MVC, UserScript,

Con la release 2 di ASP.NET MVC, eseguire l'upload di un file è un'operazione estremamente semplice. Innanzitutto il primo passo da compiere è quello di dotare la View del codice HTML necessario ad effettuare l'upload:

<form action="" method="post" enctype="multipart/form-data">
  <label for="file">File:</label>
  <input type="file" name="file" id="file" />
  <input type="submit" value="Invia" />
</form>

Supponendo di voler salvare il file caricato nella cartella /App_Data/Uploads, la controparte di codice del controller sarà

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
  if (file != null && file.ContentLength > 0)
  {
    var fileName = Path.GetFileName(file.FileName);
    var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"), fileName);
    file.SaveAs(path);
  }
  return View();
}

Come possiamo notare, abbiamo utilizzato il tipo HttpPostedFileBase come parametro di input dell'action method. Si tratta di una novità rispetto alla precedente release: ASP.NET MVC 2, infatti, introduce il value provider HttpFileCollectionValueProvider che fornisce i file caricati al model binder di default, semplificando quindi l'intero processo.

Un altro aspetto da segnalare è che, nella action mostrata in precedenza, il nome del parametro file corrisponde al valore dell'attributo name del controllo HTML contenuto nella View.
Si tratta di un'ulteriore facilitazione del value provider, grazie alla quale, ad esempio, diviene decisamente semplice anche gestire il caso di più upload in un'unica richiesta. In questo caso, infatti, è sufficiente inserire i campi di input desiderati nella view come nel codice in basso.

<form action="" method="post" enctype="multipart/form-data">
  <label for="file1">File 1:</label>
  <input type="file" name="files" id="file1" />

  <label for="file2">File 2:</label>
  <input type="file" name="files" id="file2" />

  <label for="file3">File 3:</label>
  <input type="file" name="files" id="file3" />
<input type="submit" value="Invia" />

</form>

Successivamente possiamo processare l'input nel controller in questo modo:

[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> files)
{
  foreach (var file in files)
  {
    if (file != null && file.ContentLength > 0)
    {
      var fileName = Path.GetFileName(file.FileName);
      var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
      file.SaveAs(path);
    }
  }
  return View();
}

Anche in questo caso il nome del parametro files dell'action method corrisponde al valore di tutti gli attributi name dei controlli HTML, mentre il model binder si occupa di costruire automaticamente un IEnumerable contenente l'insieme dei file postati.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi