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
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Load test di ASP.NET Core con k6
Short-circuiting della Pipeline in ASP.NET Core
I più letti di oggi
- Creare un messaggio di posta in diversi formati con ASP.NET 2.0
- Caricare un DTO esposto da un servizio tramite una query LINQ to Entities in Entity Framework
- Utilizzare il metodo reduce in #javascript https://aspit.co/ccc di @morwalpiz
- Elencare gli utenti di un dominio NT con ADSI
- Utilizzare SQL e #linq per eseguire una query con #entityframework Core https://aspit.co/bfv di @sm15455 #efcore1
- Disponibile il codice sorgente di ASP.NET MVC
- Concludiamo in bellezza con Giancarlo Sudano di Microsoft: q# for quantum programming Siamo in live streaming da: https://aspit.co/netconf-22 #aspilive #netconfit
- Caricare i dati di configurazione allo startup di un'applicazione Angular
- rilasciati nuovi template per la #aspnet web pages. funzionano anche con #webmatrix: http://u.aspitalia.com/lu
- Creare automaticamente una pipeline YAML da una sua definizione in Azure DevOps