2012-04-04 117 views
5

Básicamente, el usuario debe poder hacer clic en un enlace y descargar varios archivos PDF. Pero el Catch es que no puedo crear archivos en el servidor o en cualquier lugar. Todo tiene que estar en la memoria.Creación de archivos Zip desde Memory Stream C#

Pude crear un flujo de memoria y Response.Flush() como PDF, pero ¿cómo puedo comprimir varias secuencias de memoria sin crear archivos?

Aquí está mi código:

Response.ContentType = "application/zip"; 

      // If the browser is receiving a mangled zipfile, IIS Compression may cause this problem. Some members have found that 
      // Response.ContentType = "application/octet-stream" has solved this. May be specific to Internet Explorer. 
      Response.AppendHeader("content-disposition", "attachment; filename=\"Download.zip\""); 
      Response.CacheControl = "Private"; 
      Response.Cache.SetExpires(DateTime.Now.AddMinutes(3)); // or put a timestamp in the filename in the content-disposition     

      byte[] abyBuffer = new byte[4096]; 

      ZipOutputStream outStream = new ZipOutputStream(Response.OutputStream); 

      outStream.SetLevel(3); 

      #region Repeat for each Memory Stream 
      MemoryStream fStream = CreateClassroomRoster();// This returns a memory stream with pdf document 

      ZipEntry objZipEntry = new ZipEntry(ZipEntry.CleanName("ClassroomRoster.pdf")); 

      objZipEntry.DateTime = DateTime.Now; 

      objZipEntry.Size = fStream.Length; 

      outStream.PutNextEntry(objZipEntry); 

      int count = fStream.Read(abyBuffer, 0, abyBuffer.Length); 

      while (count > 0) 
      { 
       outStream.Write(abyBuffer, 0, count); 

       count = fStream.Read(abyBuffer, 0, abyBuffer.Length); 

       if (!Response.IsClientConnected) 
       { 
        break; 
       } 

       Response.Flush(); 
      } 

      fStream.Close(); 
      #endregion 

      outStream.Finish(); 
      outStream.Close(); 

      Response.Flush(); 
      Response.End(); 

Esto crea un archivo zip pero no hay ningún archivo en su interior

estoy usando usando iTextSharp.text - para crear pdf usando ICSharpCode.SharpZipLib.Zip - Comprimir para

Gracias, Kavita

+0

¿Alguna vez encontró una solución? Necesito hacer exactamente lo mismo. – sbonkosky

+0

no, yo no ... Probé todas las soluciones en línea, pero nada funcionó ... espero que lo encuentren – Arshya

+0

Este enlace puede ayudar: http://snipplr.com/view/47762/ – updev

Respuesta

13

Este enlace se describe cómo crear un archivo comprimido desde un MemoryStream usando SharpZipLib: https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples#wiki-anchorMemory. Usando esto y iTextSharp, pude comprimir varios archivos PDF que se crearon en la memoria.

Aquí está mi código:

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

     zipStream.SetLevel(3); //0-9, 9 being the highest level of compression 
     byte[] bytes = null; 

     // loops through the PDFs I need to create 
     foreach (var record in records) 
     { 
      var newEntry = new ZipEntry("test" + i + ".pdf"); 
      newEntry.DateTime = DateTime.Now; 

      zipStream.PutNextEntry(newEntry); 

      bytes = CreatePDF(++i); 

      MemoryStream inStream = new MemoryStream(bytes); 
      StreamUtils.Copy(inStream, zipStream, new byte[4096]); 
      inStream.Close(); 
      zipStream.CloseEntry(); 

     } 

     zipStream.IsStreamOwner = false; // False stops the Close also Closing the underlying stream. 
     zipStream.Close();   // Must finish the ZipOutputStream before using outputMemStream. 

     outputMemStream.Position = 0; 

     return File(outputMemStream.ToArray(), "application/octet-stream", "reports.zip"); 

El Método CreatePDF:

private static byte[] CreatePDF(int i) 
    { 
     byte[] bytes = null; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      Document document = new Document(PageSize.A4, 25, 25, 30, 30); 
      PdfWriter writer = PdfWriter.GetInstance(document, ms); 
      document.Open(); 
      document.Add(new Paragraph("Hello World " + i)); 
      document.Close(); 
      writer.Close(); 
      bytes = ms.ToArray(); 
     } 
     return bytes; 

    } 
+0

Gracias por la respuesta, ya que funcionó para mí también. ¿Puedes decirme cómo puedo comprimir el archivo de texto también? –

+0

funciona como un encanto! Gracias. – ahmet

0

Se podría generar archivos PDF y almacenarlo en IsolatedStorageFileStream entonces se podría comprimir el contenido de ese almacenamiento.

0

Este código lo ayudará a crear archivos Zip en varios archivos pdf que obtendrá de cada archivo desde un enlace de descarga.

 using (var outStream = new MemoryStream()) 
       { 
        using (var archive = new ZipArchive(outStream, ZipArchiveMode.Create, true)) 
        { 
         for (String Url in UrlList) 
         { 
          WebRequest req = WebRequest.Create(Url); 
          req.Method = "GET"; 
          var fileInArchive = archive.CreateEntry("FileName"+i+ ".pdf", CompressionLevel.Optimal); 
          using (var entryStream = fileInArchive.Open()) 
          using (WebResponse response = req.GetResponse()) 
          { 
           using (var fileToCompressStream = response.GetResponseStream()) 
           { 
            entryStream.Flush(); 
            fileToCompressStream.CopyTo(entryStream); 
            fileToCompressStream.Flush(); 
           } 
          } 
          i++; 
         } 

        } 
        using (var fileStream = new FileStream(@"D:\test.zip", FileMode.Create)) 
        { 
         outStream.Seek(0, SeekOrigin.Begin); 
         outStream.CopyTo(fileStream); 
        } 
       } 

espacio de nombres necesario: System.IO.Compression; System.IO.Compression.ZipArchive;

0

A continuación se muestra el código que crea un archivo zip en MemoryStream utilizando la clase ZipOutputStream que existe dentro de ICSharpCode.SharpZipLib dll.

FileStream fileStream = File.OpenRead(@"G:\1.pdf"); 
MemoryStream MS = new MemoryStream(); 

byte[] buffer = new byte[fileStream.Length]; 
int byteRead = 0; 

ZipOutputStream zipOutputStream = new ZipOutputStream(MS); 
zipOutputStream.SetLevel(9); //Set the compression level(0-9) 
ZipEntry entry = new ZipEntry(@"1.pdf");//Create a file that is needs to be compressed 
zipOutputStream.PutNextEntry(entry);//put the entry in zip 

//Writes the data into file in memory stream for compression 
while ((byteRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) 
    zipOutputStream.Write(buffer, 0, byteRead); 

zipOutputStream.IsStreamOwner = false; 
fileStream.Close(); 
zipOutputStream.Close(); 
MS.Position = 0;