Skip to main content

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:

Approfondisci

Come ottenere il Content-Type / MIME Type dall’estensione di un file in ASP.NET C#

Come posso recuperare il MIME Type di un determinato file in C#? Si tratta di una domanda molto frequente tra sviluppatori e che mi capita di sentire spesso da amici e colleghi che lavorano sul framework ASP.NET per realizzare applicazioni MVC, Web API e (ultimamente) .NET Core. Il motivo è semplice: se si lavora di frequente con filesystem e database prima o poi arriva sempre la necessità di recuperare il MIME type di un file, ad esempio al momento di inviarlo al browser dell’utente al termine di una request. In tutti i casi in cui il MIME Type non è stato memorizzato in precedenza, non possiamo fare altro che recuperarlo basandoci sull’estensione del file in questione, che nella maggior parte dei casi fornisce un indizio inequivocabile per identificare la tipologia di file da inviare: abbiamo quindi bisogno di effettuare un mapping tra le varie possibili estensioni che possono avere i nostri file e il MIME Type corrispondente a ciascuna di esse.

Esistono numerose tecniche che consentono di svolgere questa operazione in modo più o meno efficiente. Per ragioni di semplicità ci limiteremo ad approfondirne due: recuperare le informazioni contenute dal Registro di sistema (Windows Registry) o utilizzare a tale scopo una lista statica di tipi MIME (MIME Type Map). Non prenderemo in considerazione tecniche che prevedono di effettuare delle interrogazioni a servizi esterni, in quanto riteniamo che un simile approccio sarebbe assolutamente inefficiente per questo tipo di necessità.

Approfondisci

ASP.NET – Come usare le CSS Media Query dentro le viste cshtml Razor

Se lavorate in ASP.NET MVC o ASP.NET Core implementando le vostre views con Razor e vi capita di inserire gli stili CSS all’interno della vostra pagina, potreste trovarvi prima o poi faccia a faccia con uno dei seguenti errori di compilazione:

CS0103: The name ‘media’ does not exist in the current context.

CS0103: The name ‘if’ does not exist in the current context.

… E via dicendo.

Nella maggior parte dei casi questo tipo di errori è dovuto al fatto che avete utilizzato una CSS media query (o altra istruzione CSS3 analoga) come ad esempio la seguente:

Approfondisci

A potentially dangerous Request.Form value was detected from the client – come risolvere

Se sviluppate in ASP.NET e fate largo uso di webservice e/o form HTML vi sarete senz’altro imbattuti nel problema di far “digerire” al metodo di un Controller (o a una pagina ASPX, se lavorate ancora in ASP.NET Forms) caratteri potenzialmente pericolosi. L’errore che viene riportato è il seguente:

A potentially dangerous Request.Form value was detected from the client

Questo errore, come detto, viene prodotto quando vengono passati parametri GET/POST contenenti caratteri giudicati da ASP.NET potenzialmente pericolosi, quali ad esempio parentesi HTML, carattere percentuale, virgolette e via dicendo. Di seguito sono elencati i workaround che consentono di risolvere il problema, con la inevitabile raccomandazione di applicarli solo a patto di avere la piena consapevolezza delle implicazioni di sicurezza che comportano in termini di esposizione a possibili attacchi XSS (Cross-Site Script): per maggiori informazioni al riguardo consigliamo di leggere con grande attenzione questo articolo e questa voce Wikipedia, oltre all’ottima panoramica fornita dal sito ufficiale ASP.NET a riguardo.

Se siete certi di aver compreso l’argomento e volete comunque procedere, continuate a leggere.

Approfondisci

TimeTracker: una classe C# per misurare il tempo di esecuzione del codice

Una delle esigenze più sentite – e più importanti – quando si scrive codice è quella di trovare il modo di svolgere l’attività richiesta garantendo le migliori prestazioni possibili. Per far questo è indispensabile dotarsi di uno strumento che ci consentano di misurare il tempo di esecuzione di ciascuna operazione o blocco di operazioni, possibilmente in unità di tempo adeguate (millisecondi o nanosecondi) e con una precisione il più possibile accurata.

Ovviamente, tale strumento deve dare la possibilità di misurare più operazioni all’interno del medesimo contesto di esecuzione,  in modo che sia possibile definire vari lap e confrontarli tra loro: insomma, stiamo parlando in buona sostanza di qualcosa che fornisca le funzionalità tipiche di un comune cronometro.

Con questo obiettivo in mente alcuni anni fa ho sviluppato una classe che consente di fare esattamente questo. Il suo nome è TimeTracker e può essere utilizzata per creare un numero n di lap nel corso dell’esecuzione di un qualsiasi programma. Ciascun lap, una volta creato, può essere confrontato con qualsiasi altro lap sulla base di uno dei formati temporali disponibili: nanosecondi, microsecondi, millisecondi, secondi, minuti o ore.

Approfondisci

Close