2009-05-07 11 views
10

Necesito construir y enviar un archivo zip a un usuario.¿Cómo puedo generar y enviar un archivo .zip a un usuario en C# ASP.NET?

que he visto ejemplos de hacer una o la otra, pero no ambas, y estoy ansioso por ver si hay algún 'mejores prácticas' o cualquier cosa.

Lo siento por la confusión. Voy a generar el zip sobre la marcha para el usuario web, y enviarlo a ellos en la respuesta HTTP. No en un correo electrónico

Marcos

Respuesta

18

Me segundos el voto para SharpZipLib para crear el archivo Zip. Luego, deberá agregar un encabezado de respuesta a la salida para forzar el diálogo de descarga.

http://aspalliance.com/259

debería darle un buen punto de partida para lograr eso. Es, básicamente, tiene que agregar un encabezado de respuesta, establecer el tipo de contenido y escribir el archivo en la secuencia de salida:

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

Esa última línea podría ser cambiado a un Response.Write (filecontents) si no desea guardar en un archivo temporal.

+0

http://aspalliance.com/259 está muerto. –

2

estoy seguro de que otros recomiendan SharpZipLib

¿Cómo se tiene la intención de "enviar" la misma. NET ha construido en Bibliotecas para el correo electrónico a través de SMTP

EDITAR

En ese caso, usted desea capturar el flujo de salida de SharpZipLib y escribir directamente a la respuesta. Solo asegúrese de tener el Mimetype correcto configurado en los Encabezados de respuesta (aplicación/zip) y asegúrese de que no responda. Escriba algo más al usuario.

0

De acuerdo con la anterior, SharpZipLib, para la creación de archivos .zip en .NET, parece una opción muy popular.

En cuanto a 'enviar', si quiere decir a través de SMTP/Correo electrónico, necesitará usar el espacio de nombre System.Net.Mail. La documentación de la clase System.Net.Mail.Attachment tiene un ejemplo de cómo enviar un archivo por correo electrónico

Raspe todo lo anterior, cuando publiqué esto, veo que se refería a la devolución a través de HTTP Response.

9

DotNetZip le permite hacer esto fácilmente, sin tener que escribir en un archivo de disco en el servidor. Puede escribir un archivo zip directamente en la secuencia de respuesta, lo que hará que el cuadro de diálogo de descarga aparezca en el navegador.

Example ASP.NET code for DotNetZip

More example ASP.NET code for DotNetZip

tijeretazo:

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 en 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

Con mucho, la mejor biblioteca ZIP para C# – kape123

+0

A partir de septiembre de 2014 (y .Net 4.5) DotNetZip ahora no es confiable, a menudo produciendo archivos comprimidos que están corruptos o no se pueden abrir. Una pena, ya que estaba funcionando muy bien durante el primer año o así que lo tuve. –

0

Una preocupación es el tamaño del archivo que va a ser la transmisión de el cliente.Si usa SharpZipLib para crear el archivo ZIP en la memoria, no tiene archivos temporales para la limpieza, pero pronto se encontrará con problemas de memoria si los archivos son grandes y varios usuarios simultáneos están descargando archivos. (Experimentamos esto con bastante frecuencia cuando los tamaños de ZIP llegaron al rango de 200 MB +). Trabajé alrededor de esto mediante el archivo temporal en el disco, transmitiéndolo al usuario y eliminándolo cuando se completó la solicitud.

0

DotNetZip crea la secuencia sin guardar ningún recurso en el servidor, por lo que no tiene que acordarse de borrar nada. Como dije antes, su codificación rápida e intuitiva, con una implementación eficiente.

Moshe

0

que modifica algunos códigos como abajo, yo 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); 
    } 

este código se alguna lista lista de archivos que contiene los copia en la carpeta de archivos temporales , crear el archivo zip temporal luego lea todos los bytes de ese archivo y envíe bytes en la secuencia de respuesta, finalmente elimine el archivo temporal y la carpeta

Cuestiones relacionadas