La generazione al volo di un file Zip è uno dei sistemi più comodi, dal punto di vista degli utenti, per effettuare il download di un insieme di file con una sola operazione. Esistono diverse librerie che consentono di creare questo tipo di file, e anche il .NET Framework, a partire dalla versione 4.5, aggiunge il supporto alla compressione Zip.
Il modo più intuitivo per effettuare un download, in ASP.NET MVC, è quello di creare un custom action result, che chiameremo ZipFileResult, così che nel nostro controller possiamo limitarci a scrivere qualcosa di questo tipo:
public ActionResult ZipDemo() { string[] fileNames = ...; return new ZipFileResult(fileNames) { FileDownloadName = "download.zip" }; }
La classe ZipFileResult, quindi, incapsula tutta la logica relativa alla compressione. Nell'esempio in basso troviamo una possibile implementazione basata sulla libreria open source DotNetZip, per certi versi più versatile e facilmente utilizzabile di quanto presente all'interno di .NET 4.5.
public class ZipFileResult : FileResult { private IEnumerable<string> _fileNames; public ZipFileResult(params string[] fileNames) : base("application/zip, application/octet-stream") { _fileNames = fileNames; } // ... altro codice qui ... }
Piuttosto che riscrivere tutto da zero, abbiamo sfruttato la classe base FileResult, che contiene già la logica per impostare il content type della response e il nome predefinito. Il codice principale, però, è costituito dall'override del metodo WriteFile, che si occupa di scrivere il contenuto sullo stream di output della risposta HTTP.
protected override void WriteFile(HttpResponseBase response) { using (var zipFile = new ZipFile()) { zipFile.AddFiles(_fileNames, preserveDirHierarchy: false, directoryPathInArchive: string.Empty); zipFile.Save(response.OutputStream); } }
L'esempio in alto è decisamente banale, e non fa altro che istanziare una classe ZipFile e sfruttare il metodo AddFiles per aggiungere il contenuto desiderato. Un overload del metodo Save consente di passare come parametro uno Stream. Grazie a questa tecnica siamo in grado di supportare anche file di grandi dimensioni, visto che non manteniamo una copia in memoria ma la inviamo direttamente all'OutputStream della response.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Gestire domini wildcard in Azure Container Apps
Utilizzare Copilot con Azure Cosmos DB
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Usare le navigation property in QuickGrid di Blazor
Ordinare randomicamente una lista in C#
Code scanning e advanced security con Azure DevOps
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Usare un KeyedService di default in ASP.NET Core 8
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Proteggere le risorse Azure con private link e private endpoints
I più letti di oggi
- Utilizzare angular-cli per creare una direttiva in #angular2 https://aspit.co/bft di @sm15455
- le impostazioni sono su #windowslive, quindi basta il liveid per avere tutte le ... http://aspitalia.com/build-win8 #BldWin
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- la nostra app per #win8 è nello store che vi aspetta da qualche mese: provatela! contenuti, forum e push! https://aspit.co/pd