Recabamos por distintos espacios para darte la respuesta para tu inquietud, si continúas con dudas puedes dejar tu pregunta y respondemos con gusto.
Solución:
Después de jugar un poco más y leer, pude resolver esto. Así es como puede crear un archivo zip (archivo) con varios archivos sin escribir ningún dato temporal en el disco:
using (var compressedFileStream = new MemoryStream())
//Create an archive and store the stream in memory.
using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, false))
foreach (var caseAttachmentModel in caseAttachmentModels)
//Create a zip entry for each attachment
var zipEntry = zipArchive.CreateEntry(caseAttachmentModel.Name);
//Get the stream of the attachment
using (var originalFileStream = new MemoryStream(caseAttachmentModel.Body))
using (var zipEntryStream = zipEntry.Open())
//Copy the attachment stream to the zip entry stream
originalFileStream.CopyTo(zipEntryStream);
return new FileContentResult(compressedFileStream.ToArray(), "application/zip") FileDownloadName = "Filename.zip" ;
Esta es una variación de la gran respuesta aceptada publicada por el OP. Sin embargo, esto es para WebForms en lugar de MVC. Estoy trabajando asumiendo que caseAttachmentModel.Body es un byte[]
Esencialmente, todo es igual excepto con un método adicional que envía el zip como una respuesta.
using (var compressedFileStream = new MemoryStream())
//Create an archive and store the stream in memory.
using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false))
foreach (var caseAttachmentModel in caseAttachmentModels)
//Create a zip entry for each attachment
var zipEntry = zipArchive.CreateEntry(caseAttachmentModel.Name);
//Get the stream of the attachment
using (var originalFileStream = new MemoryStream(caseAttachmentModel.Body))
using (var zipEntryStream = zipEntry.Open())
//Copy the attachment stream to the zip entry stream
originalFileStream.CopyTo(zipEntryStream);
sendOutZIP(compressedFileStream.ToArray(), "FileName.zip");
private void sendOutZIP(byte[] zippedFiles, string filename)
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/x-compressed";
Response.Charset = string.Empty;
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
Response.BinaryWrite(zippedFiles);
Response.OutputStream.Flush();
Response.OutputStream.Close();
Response.End();
¡También me gustaría señalar que el consejo dado por @Levi Fuller sobre las referencias en la respuesta aceptada es acertado!
Parece que GZipStream y DeflateStream le permitirían usar conjuntos de vapores/bytes para resolver su problema, pero tal vez no con un formato de archivo de compresión que pueda usar la mayoría de los usuarios. (es decir, su archivo tendría una extensión .gz) Si este archivo solo se usa internamente, podría estar bien.
No sé cómo puede hacer un ZIP usando las bibliotecas de Microsoft, pero recuerdo que esta biblioteca admite el tipo de cosas que puede encontrar útiles: http://sevenzipsharp.codeplex.com/
Tiene licencia bajo LGPL.
Si te mola el asunto, eres capaz de dejar una división acerca de qué le añadirías a esta crónica.