Saltar al contenido

Crear archivo zip desde byte[]

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *