2012-04-04 33 views
5

基本的に、ユーザーは1つのリンクをクリックして複数のpdfファイルをダウンロードできるはずです。しかし、キャッチは私がサーバーやどこにでもファイルを作成することはできません。すべてが記憶になければならない。メモリストリームからのZipファイルの作成C#

メモリストリームと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 を作成するためには、 -

おかげでお越しため、 Kavita

+0

ソリューションを見つけたことがありますか?私はまったく同じことをする必要があります。 – sbonkosky

+0

いいえ私はしませんでした..私はすべてのソリューションをオンラインで試してみましたが、何も働いていません..あなたがそれを見つけることを願って – Arshya

+0

このリンクは役立ちます:http://snipplr.com/view/47762/ – updev

答えて

13

は、このリンクは、説明しますSharpZipLib:https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples#wiki-anchorMemoryを使用してMemoryStreamからzipを作成する方法これと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

それは私のために働いた同じように。どうやってテキストファイルを圧縮することができますか教えてください。 –

+0

は魅力的に機能します!ありがとう。 – ahmet

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; 
関連する問題