2016-04-13 15 views
2

Bir sfx (Self Extracting Archive) döndürmesi gereken bir REST son noktası oluşturuyorum. Asıl arşivi oluşturmaya kadar ağır kaldırma yapmak için Ionic.Zip kullanıyorum, ancak bitmiş sfx arşivini istemciye nasıl yazmam gerektiğini anlamakta biraz sorun yaşıyorum.DotNetZip otomatik çıkarıcıyı doğrudan Response.OutputStream'e kaydeder

ZipFile.Save(Response.OutputStream) bana bir zip dosyası yazmak için iyi çalışıyor ve ZipFile.SaveSelfExtractor(Response.OutputStream, options) gibi bir şey kullanarak aynı şeyi yapamayacağımı şaşırdım. docs'a göre, bir akım alan SaveSelfExtractor için aşırı yüklenme yok. Web'de kazıp açabiliyorum

örnekler ben create my own stub ve geri ilk akışına yazmak ve sonra aynı akışta üstünde zip arşivi yazabilirsiniz nasıl ya

  1. açıklıyor.
  2. temporarily store the sfx on the server nasıl yapabilirim ve sonra bir FileStream kullanarak istemciye geri yazın.

Ancak, sunucudaki sfx yürütülebilir dosyasını geçici olarak depolamak veya saklamak istemiyorum ve kendi sfx dizgimi oluşturmak istemiyorum. İyon paketinde halihazırda bulunan saplamayı kullanmaktan oldukça memnunum.

Ionic.Zip.ZipFile'un sfx'i oluşturmasına ve tek seferde Response.OutputStream'a geri göndermesine izin vermenin bir yolu var mı?

Bu ne var şimdi: Ben kuşaklar için bu mesaj

using System.IO; 
using Ionic.Zip; 
using System.Web.Http; 
using Context = System.Web.HttpContext; 

namespace MyCompany.web.Controllers 
{ 
    [HttpGet] 
    public void Export() 
    { 
     var response = Context.Current.Response; 
     var stream = response.OutputStream; 

     // Create the zip archive in memory 
     using (var archive = new ZipFile()) 
     { 
      archive.Comment = "Self extracting export"; 
      archive.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; 

      using (var memoryStream = new MemoryStream()) 
      using (var streamWriter = new StreamWriter(memoryStream)) 
      { 
       streamWriter.WriteLine("Hello World"); 
       archive.AddEntry("testfile.txt", memoryStream.ToArray()); 
      } 

      // What I want is to write this to outputstream 
      archive.SaveSelfExtractor(/*stream*/ "export.exe", new SelfExtractorSaveOptions 
      { 
       Flavor = SelfExtractorFlavor.ConsoleApplication, 
       Quiet = true, 
       ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently, 
       RemoveUnpackedFilesAfterExecute = false 
      }); 
      /*archive.Save(stream); // This will write to outputstream */ 
     } 

     response.AddHeader("Content-Disposition", "attachment; filename=export.exe"); 
     response.AddHeader("Content-Description", "File Transfer"); 
     response.AddHeader("Content-Transfer-Encoding", "binary"); 
     response.ContentType = "application/exe"; 

     response.Flush(); 
     response.Close(); 
     response.End(); 
    } 
} 
+0

[kaynak kodu] (https://dotnetzip.codeplex.com/SourceControl/latest#Zip/ZipFile.SaveSelfExtractor.cs) hayır, belirli akışına doğrudan yazma şey olmadığını göstermek gibi görünüyor onlar kendiliğinden açılan zip dosyaları için hesaba katılmıştır. Kodlarını değiştirmek veya kendiniz yazmak zorundasınız. –

+0

Paketlerinden kullandıkları sfx uzantısını ayıklamak mümkün değil ve bunu ZipFile.Save() 'veya başka bir şeyden önce akışa yazmak mümkün mü? Kaynak kodlarını incelemek ve tam olarak anlayabilmek için C# 'daki tecrübeye sahip değilim, ama saplama zaten bir yerde mevcut olmalı mı, yoksa bunu anında mı üretiyorlar? –

+1

Daha yakından incelendiğinde, yalnızca saplama eklemekle kalmadıkları anlaşılıyor, aslında doğru kodlamaları oluşturmak için anında bir kod yazıyorlar. Muhtemelen bunun için iyi bir neden vardır ve muhtemelen bu nedenle doğrudan doğruya akışı desteklemiyorlar - çok az kazanç elde etmek için çok fazla iş olabilirdi. Ama belki sizin için bir kez bir saplama oluşturmak ve sadece zip akışına bunu eklemeniz daha iyidir. –

cevap

0

. Gelebildiğim en iyi çözüm buydu. Diğerleri daha iyi bir çözüm sunmaya davetlidir.

[HttpGet] 
    public void Export() 
    { 
     var response = Context.Current.Response; 
     var writeStream = response.OutputStream; 

     var name  = "export.exe"; 

     // Create the zip archive in memory 
     using (var archive = new Ionic.Zip.ZipFile()) 
     { 
      archive.Comment = "Self extracting export"; 
      archive.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; 

      using (var memoryStream = new MemoryStream()) 
      using (var streamWriter = new StreamWriter(memoryStream)) 
      { 
       streamWriter.WriteLine("Hello World"); 
       streamWriter.Flush(); 
       archive.AddEntry("testfile.txt", memoryStream.ToArray()); 
      } 

      // Write sfx file to temp folder on server 
      archive.SaveSelfExtractor(name, new Ionic.Zip.SelfExtractorSaveOptions 
      { 
       Flavor = Ionic.Zip.SelfExtractorFlavor.ConsoleApplication, 
       Quiet = true, 
       DefaultExtractDirectory = "\\temp", 
       SfxExeWindowTitle = "Export", 
       ExtractExistingFile = Ionic.Zip.ExtractExistingFileAction.OverwriteSilently, 
       RemoveUnpackedFilesAfterExecute = false 
      }); 

      // Read file back and output to response 
      using (var fileStream = new FileStream(name, FileMode.Open)) 
      { 
       byte[] buffer = new byte[4000]; 
       int n = 1; 
       while (n != 0) 
       { 
        n = fileStream.Read(buffer, 0, buffer.Length); 
        if (n != 0) 
         writeStream.Write(buffer, 0, n); 
       } 
      } 

      // Delete the temporary file 
      if (File.Exists(name)) 
      { 
       try { File.Delete(name); } 
       catch (System.IO.IOException exc1) 
       { 
        Debug.WriteLine("Warning: Could not delete file: {0} {1}", name, exc1); 
       } 
      } 
     } 

     response.AddHeader("Content-Disposition", "attachment; filename=" + name); 
     response.AddHeader("Content-Description", "File Transfer"); 
     response.AddHeader("Content-Transfer-Encoding", "binary"); 
     response.ContentType = "application/exe"; 

     response.Flush(); 
     response.Close(); 
     response.End(); 
    } 
-1
using (ZipFile zip = new ZipFile()) 
{ 
    //string DirPath = Application.StartupPath + @"\CSVfile\files" + DateTime.Now.ToString("yyMMdd"); 
    string DirPath = Server.MapPath("DoneCSV//" + ViewState["Filepath"]); 
    string savepath = DirPath + "/" + ViewState["Filepath"] + "_" + DateTime.Now.ToString("yyMMdd") + ".zip"; 
    zip.AddDirectory(DirPath); 
    zip.Save(savepath); 
    //sendmail(savepath); 
} 
+0

Bu, kendiliğinden açılan bir arşiv oluşturmaz. –

İlgili konular