Come creare file e archivi ZIP per il download con ASP.NET MVC e C#

ASP.NET MVC - Aggiungere uno o più percorsi di ricerca predefiniti per le View

Durante lo sviluppo di una applicazione web con ASP.NET MVC e/o ASP.NET Core può capitare di avere l'esigenza di dover creare un archivio ZIP all'interno di un Controller, ad esempio per consentire ai propri utenti di effettuare il download di più file all'interno di una singola request.

Fino a non molto tempo fa il modo migliore per implementare questa feature era ricorrere a librerie esterne, come le note SharpZipLib, DotNetZip e via dicendo... a meno di non voler ricorrere al namespace System.IO.Compression, a patto però di rinunciare a molte delle comodità garantite dalle soluzioni sopracitate.

A partire dal .NET Framework 4.5 è stata finalmente introdotta anche una soluzione nativa che, almeno nelle sue funzionalità di base, non ha nulla da invidiare alle librerie di terze parti più diffuse: si tratta della classe ZipArchive, new-entry del namespace System.IO.Compression, che consente di creare archivi in modo estremamente semplice e veloce.

Di seguito un veloce esempio che utilizza un MemoryStream e un paio di byte array contenenti i dati di altrettanti file da comprimere:

L'esempio è pensato per essere inserito all'interno di un qualsiasi Controller ASP.NET MVC e/o ASP.NET Core. Inutile dire che, in caso di necessità, è possibile modificare il valore di CompressionLevel per ottenere un rapporto più adeguato di velocità contro dimensioni dell'archivio.

Inoltre, nel caso in cui si abbia l'esigenza di dover creare fisicamente il file zip anziché trasmetterlo come ActionResult, è possibile salvare il MemoryStream su disco o, meglio ancora, sostituirlo con un più adeguato FileStream: nell'esempio di codice presentato sopra ho utilizzato il metodo Controller.File (reso disponibile dal namespace System.Web.Mvc) per restituire un oggetto di tipo FileContentResult. Nel caso in cui non ci si trovi in un contesto ASP.NET MVC è comunque possibile gestire MemoryStream in vari altri modi, come ad esempio Response.OutputStream o altre tecniche standard.

Per il momento è tutto: felice sviluppo!

 

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


Il periodo di verifica reCAPTCHA è scaduto. Ricaricare la pagina.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.