2009-05-07 11 views
10

Ho bisogno di costruire e inviare un zip a un utente.Come posso generare e inviare un file .zip a un utente in C# ASP.NET?

Ho visto esempi fare l'uno o l'altro, ma non entrambi, e sono curioso di sapere se ci sono delle "migliori pratiche" o altro.

Ci scusiamo per la confusione. Ho intenzione di generare il zip al volo per l'utente web e inviarlo a loro nella risposta HTTP. Non in una e-mail

Mark

risposta

18

Vorrei in secondo luogo il voto per SharpZipLib per creare il file Zip. Quindi dovrai aggiungere un'intestazione di risposta all'output per forzare la finestra di download.

http://aspalliance.com/259

dovrebbe darvi un buon punto di partenza per raggiungere questo obiettivo. Che, fondamentalmente necessario aggiungere un'intestazione di risposta, impostare il tipo di contenuto e scrivere il file nel flusso di output:

Response.AppendHeader("content-disposition", "attachment; filename=" + name); 
Response.ContentType = "application/zip"; 
Response.WriteFile(pathToFile); 

L'ultima linea potrebbe essere cambiato in un Response.Write (FileContents) se non si vuole salva in un file temporaneo.

+0

http://aspalliance.com/259 è morto. –

2

Sono sicuro che gli altri si consiglia SharpZipLib

Come intendete per "Send". NET ha costruito in librerie di e-mail via SMTP

EDIT

In questo caso si desidera catturare il flusso di output da SharpZipLib e scrivere direttamente alla risposta. Assicurati di avere il set Mimetype corretto nelle intestazioni di risposta (application/zip) e assicurati di non rispondere. Scriva qualcos'altro per l'utente.

0

D'accordo con sopra, SharpZipLib, per la creazione di file .zip in .NET, sembra un'opzione molto popolare.

Per quanto riguarda "invio", se si intende tramite SMTP/Email, sarà necessario utilizzare lo spazio dei nomi System.Net.Mail. La documentazione della classe System.Net.Mail.Attachment ha un esempio di come inviare un file tramite e-mail

Scratch quanto sopra, al momento in cui ho postato questo vedo che intendevi restituire tramite HTTP Response.

9

DotNetZip consente di farlo facilmente, senza mai scrivere su un file su disco sul server. È possibile scrivere un archivio zip direttamente nel flusso di risposta, che farà apparire la finestra di download sul browser.

Example ASP.NET code for DotNetZip

More example ASP.NET code for DotNetZip

snip:

Response.Clear(); 
    Response.BufferOutput = false; // false = stream immediately 
    System.Web.HttpContext c= System.Web.HttpContext.Current; 
    String ReadmeText= String.Format("README.TXT\n\nHello!\n\n" + 
            "This is text for a readme."); 
    string archiveName= String.Format("archive-{0}.zip", 
             DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip"; 
    Response.AddHeader("content-disposition", "filename=" + archiveName); 

    using (ZipFile zip = new ZipFile()) 
    { 
     zip.AddFiles(f, "files");    
     zip.AddFileFromString("Readme.txt", "", ReadmeText); 
     zip.Save(Response.OutputStream); 
    } 
    Response.Close(); 

o in VB.NET:

Response.Clear 
    Response.BufferOutput= false 
    Dim ReadmeText As String= "README.TXT\n\nHello!\n\n" & _ 
           "This is a zip file that was generated in ASP.NET" 
    Dim archiveName as String= String.Format("archive-{0}.zip", _ 
       DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")) 
    Response.ContentType = "application/zip" 
    Response.AddHeader("content-disposition", "filename=" + archiveName) 

    Using zip as new ZipFile() 
     zip.AddEntry("Readme.txt", "", ReadmeText, Encoding.Default) 
     '' filesToInclude is a string[] or List<String> 
     zip.AddFiles(filesToInclude, "files")    
     zip.Save(Response.OutputStream) 
    End Using 
    Response.Close 
+0

La migliore libreria ZIP per C# – kape123

+0

A partire da settembre 2014 (e .Net 4.5) DotNetZip è ora inaffidabile, spesso producendo archivi zip corrotti o che non possono essere aperti. Un vero peccato, perché funzionava magnificamente per il primo anno o giù di lì. –

0

Una delle preoccupazioni è la dimensione del file che si sarà Streaming per il cliente.Se usi SharpZipLib per creare ZIP in-memory, non hai nessun file temporaneo da ripulire, ma presto ti imbatterai in problemi di memoria se i file sono grandi e un certo numero di utenti simultanei sta scaricando file. (L'abbiamo sperimentato abbastanza frequentemente quando le dimensioni ZIP arrivavano all'intervallo di 200 MB +.) Ho lavorato attorno al file temporaneo su disco, lo streaming all'utente, e l'ho eliminato quando la richiesta è stata completata.

0

DotNetZip crea lo stream senza salvare risorse sul server, quindi non è necessario ricordare di cancellare nulla. Come ho detto prima, la sua codifica veloce e intuitiva, con un'implementazione efficiente.

Moshe

0

ho modificato alcuni codici come sotto, io uso System.IO.Compression

public static void Zip(HttpResponse Response, HttpServerUtility Server, string[] pathes) 
    { 
     Response.Clear(); 
     Response.BufferOutput = false;   

     string archiveName = String.Format("archive-{0}.zip", 
              DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
     Response.ContentType = "application/zip"; 
     Response.AddHeader("content-disposition", "filename=" + archiveName); 

     var path = Server.MapPath(@"../TempFile/TempFile" + DateTime.Now.Ticks); 
     if (!Directory.Exists(Server.MapPath(@"../TempFile"))) 
      Directory.CreateDirectory(Server.MapPath(@"../TempFile")); 

     if (!Directory.Exists(path)) 
      Directory.CreateDirectory(path); 
     var pathzipfile = Server.MapPath(@"../TempFile/zip_" + DateTime.Now.Ticks + ".zip"); 
     for (int i = 0; i < pathes.Length; i++) 
     { 
      string dst = Path.Combine(path, Path.GetFileName(pathes[i])); 
      File.Copy(pathes[i], dst); 
     } 
     if (File.Exists(pathzipfile)) 
      File.Delete(pathzipfile); 
     ZipFile.CreateFromDirectory(path, pathzipfile); 
     { 
      byte[] bytes = File.ReadAllBytes(pathzipfile); 
      Response.OutputStream.Write(bytes, 0, bytes.Length); 
     } 
     Response.Close(); 
     File.Delete(pathzipfile); 
     Directory.Delete(path, true); 
    } 

questo codice viene qualche lista che contiene l'elenco dei file copiarli nella cartella Temp , creare file zip temporaneo quindi leggi tutti i byte di quel file e invia i byte nel flusso di risposta, elimina definitivamente il file temporaneo e la cartella

Problemi correlati