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

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.

Per il momento è tutto: felice sviluppo!

 

RELATED POSTS

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.

View all posts by Ryan