2012-04-04 103 views
5

基本上用户应该能够点击一个链接并下载多个PDF文件。但是Catch是我无法在服务器或任何地方创建文件的。一切都必须记忆。从内存流C创建Zip文件#

我能够创建内存流和Response.Flush()它作为pdf,但我怎么压缩多个内存流而不创建文件。

这里是我的代码:

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(); 

这将创建一个zip文件,但里面有它没有文件

我使用 使用iTextSharp.text - 使用ICSharpCode.SharpZipLib.Zip创建PDF - 为荏苒

感谢, 卡维塔

+0

您是否曾经找到过解决方案?我需要做同样的事情。 – sbonkosky 2012-12-19 16:02:16

+0

不,我没有..我尝试了所有的解决方案,但没有任何工作..希望你找到它 – Arshya 2012-12-19 17:14:19

+0

这个链接可能会有所帮助:http://snipplr.com/view/47762/ – updev 2013-11-19 21:49:31

回答

13

此链接介绍如何使用SharpZipLib从MemoryStream创建一个zip文件:https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples#wiki-anchorMemory。使用这个和iTextSharp,我可以压缩在内存中创建的多个PDF文件。

这里是我的代码:

 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"); 

的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

谢谢你的答案,因为它为我工作以及。你能告诉我如何压缩文本文件吗? – 2016-10-05 10:10:40

+0

工程就像一个魅力!谢谢。 – ahmet 2017-09-11 13:39:41

0

您可以生成PDF文件并将其保存在IsolatedStorageFileStream那么你可以压缩从存储的内容。

0

此代码将帮助您创建多个pdf文件的Zip,您将从下载链接中获取每个文件。

 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); 
        } 
       } 

命名空间需要: System.IO.Compression; System.IO.Compression.ZipArchive;

0

下面是使用ICSharpCode.SharpZipLib dll中存在的ZipOutputStream类在MemoryStream中创建zip文件的代码。

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;