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
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Implementare il throttling in ASP.NET Core
Usare un KeyedService di default in ASP.NET Core 8
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Short-circuiting della Pipeline in ASP.NET Core
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Load test di ASP.NET Core con k6
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
I più letti di oggi
- Utilizzare WebAssembly con .NET, ovunque
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)