2010-04-19 16 views
6

Ho una cartella sul mio server web che contiene centinaia di file mp3. Mi piacerebbe fornire l'opzione per un utente di scaricare un archivio zippato di ogni mp3 nella directory da una pagina web.ASP.NET Scarica tutti i file come Zip

Voglio comprimere i file a livello di programmazione solo quando necessario. Poiché il file zip sarà abbastanza grande, penso che sarà necessario inviare il file zip allo stream di risposta poiché viene zippato, per motivi di prestazioni.

È possibile? Come posso farlo?

+0

Una volta che ottenete la vostra risposta, assicurarsi di disattivare la compressione quando si aggiungono file al file zip ... file Mp3 dont comprimere molto bene .... –

+0

Naturalmente, perché sono già compressi . Grazie del promemoria. –

risposta

7

Qui è il codice che uso per fare questo con DotNetZip - funziona molto bene. Ovviamente sarà necessario fornire le variabili per outputFileName, folderName e includeSubFolders.

response.ContentType = "application/zip"; 
response.AddHeader("content-disposition", "attachment; filename=" + outputFileName); 
using (ZipFile zipfile = new ZipFile()) { 
    zipfile.AddSelectedFiles("*.*", folderName, includeSubFolders); 
    zipfile.Save(response.OutputStream); 
} 
+1

Nel caso in cui non si desideri la sottostruttura della directory nell'archivio Zip, utilizzare semplicemente il metodo overload 'zipfile.AddSelectedFiles (" *. * ", FolderName, direcotryInZip, includeSubFolders);' – marquito

+0

@marquito In effetti, penso che sia accettato la risposta sarebbe meglio se avesse usato quel sovraccarico. – stephen

+0

hey Ray, ho bisogno di un piccolo aiuto relativo alla creazione di file zip. SE puoi aiutare. fammi sapere qui Sarebbe felice :) Grazie – BNN

1

È possibile aggiungere un gestore personalizzato (file .ashx) che accetta il percorso del file, legge il file compresso utilizzando una libreria di compressione e restituisce i byte all'utente finale con il tipo di contenuto corretto.

4

Non riesco a credere quanto sia stato facile. Dopo aver letto this, ecco il codice che ho usato:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.BufferOutput = false; 
    Response.ContentType = "application/zip"; 
    Response.AddHeader("content-disposition", "attachment; filename=pauls_chapel_audio.zip"); 

    using (ZipFile zip = new ZipFile()) 
    { 
     zip.CompressionLevel = CompressionLevel.None; 
     zip.AddSelectedFiles("*.mp3", Server.MapPath("~/content/audio/"), "", false); 
     zip.Save(Response.OutputStream); 
    } 

    Response.Close(); 
} 
0
  foreach (GridViewRow gvrow in grdUSPS.Rows) 
      { 
        CheckBox chk = (CheckBox)gvrow.FindControl("chkSelect"); 
       if (chk.Checked) 
       { 
       string fileName = gvrow.Cells[1].Text; 

       string filePath = Server.MapPathfilename); 
       zip.AddFile(filePath, "files"); 
       } 
      } 
      Response.Clear(); 
      Response.AddHeader("Content-Disposition", "attachment; filename=DownloadedFile.zip"); 
      Response.ContentType = "application/zip"; 
      zip.Save(Response.OutputStream); 
      Response.End(); 
Problemi correlati