2012-01-12 18 views
6

Uso DotNetZip para crear un archivo zip con una cadena en la memoria y descargarlo como un archivo adjunto con el siguiente código.SharpZipLib crear un archivo con una cadena en la memoria y descargarlo como un archivo adjunto

byte[] formXml = UTF8Encoding.Default.GetBytes("<form><pkg>Test1</pkg></form>"); 
byte[] formHtml = UTF8Encoding.Default.GetBytes("<html><body>Test2</body></html>"); 

ZipFile zipFile = new ZipFile(); 
zipFile.AddEntry("Form.xml", formXml); 
zipFile.AddEntry("Form.html", formHtml); 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.AppendHeader("content-disposition", "attachment; filename=FormsPackage.zip"); 
zipFile.Save(Response.OutputStream); 
zipFile.Dispose(); 

Ahora tengo la obligación de hacer lo mismo con SharpZipLib. Cómo puedo hacerlo ? ¿SharpZipLib admite agregar archivos como una matriz de bytes?

Respuesta

14

Try a continuación

MemoryStream msFormXml = new MemoryStream(UTF8Encoding.Default.GetBytes("<form><pkg>Test1</pkg></form>")); 
MemoryStream msFormHTML = new MemoryStream(UTF8Encoding.Default.GetBytes("<html><body>Test2</body></html>")); 

MemoryStream outputMemStream = new MemoryStream(); 
ZipOutputStream zipStream = new ZipOutputStream(outputMemStream); 

zipStream.SetLevel(3); //0-9, 9 being the highest level of compression 

ZipEntry xmlEntry = new ZipEntry("Form.xml"); 
xmlEntry.DateTime = DateTime.Now; 
zipStream.PutNextEntry(xmlEntry); 
StreamUtils.Copy(msFormXml, zipStream, new byte[4096]); 
zipStream.CloseEntry(); 

ZipEntry htmlEntry = new ZipEntry("Form.html"); 
htmlEntry.DateTime = DateTime.Now; 
zipStream.PutNextEntry(htmlEntry); 
StreamUtils.Copy(msFormHTML, zipStream, new byte[4096]); 
zipStream.CloseEntry(); 

zipStream.IsStreamOwner = false; 
zipStream.Close(); 

outputMemStream.Position = 0; 

byte[] byteArray = outputMemStream.ToArray(); 

Response.Clear(); 
Response.AppendHeader("Content-Disposition", "attachment; filename=FormsPackage.zip"); 
Response.AppendHeader("Content-Length", byteArray.Length.ToString()); 
Response.ContentType = "application/octet-stream"; 
Response.BinaryWrite(byteArray); 
+0

Gracias. Esto funcionó! – Dimuthu

+0

Una vez que finaliza la solicitud y finaliza la descarga, ¿se libera la memoria? También estoy haciendo algo muy similar, y puede haber muchos archivos. Necesito la memoria borrada después de que la solicitud termine. Estoy bastante seguro de que el recolector de basura se encargaría de eso, pero no estoy 100% seguro. – harsimranb

+0

Se supone que el recolector de basura debe hacerlo. Pero para tipos de datos como "MemoryStream", debe llamar a Dispose() o usar declaraciones "using" para garantizar que la memoria se libera. –

Cuestiones relacionadas