2017-06-04 7 views
-1

私は同様の質問に対する回答を研究しましたが、ダウンロードするために複数のファイルがziparchiveに集められている場所は見ていません。次の例はエラーは発生しませんが、認識可能なzipファイルは返されません。メモリストリームへの複数ファイルのZiparchive

public async Task<HttpResponseMessage> SendAZipOfFiles() 
{ 
     var memoryStream = new MemoryStream(); 
     var response = new HttpResponseMessage(HttpStatusCode.OK); 

     List<string> filepaths = await GetSomeFiles(); 
     using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
     { 
      foreach (string filepath in filepaths) 
      { 
       string filename = Path.GetFileName(filepath); 
       using (StreamReader reader = new StreamReader(filepath)) 
       using (StreamWriter writer = new StreamWriter(archive.CreateEntry(filename).Open())) 
       { 
        writer.Write(reader.ReadToEnd()); 
       } 
      } 
     } 
     memoryStream.Position = 0; 
     response.Content = new StreamContent(memoryStream); 
     response.Content.Headers.ContentLength = memoryStream.Length; 
     response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
     { 
      FileName = "TheFile.zip") 
     }; 
     response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip"); 
    return response; 
} 
+0

サイドノートがありますが、別の方法としてビュン一部を抜け出すときにに非常に簡単になり、 (単体テスト。 –

答えて

1

私はあなたがあなたの目的のために役に立たないですが、彼らが具体的にテキストファイルを読み書きするために使用されているので、エンコーディングの問題を作成することができないだけでStreamReaderStreamWriterを、使用している参照してください。

プレーンテキストファイルだけでなく、あらゆる種類のファイルをアーカイブに追加する必要がある場合、読み取り/書き込み時にデータが破損する可能性があります。

は代わりに、単にエントリをアーカイブするために、生のストリームをコピーします。

public async Task<HttpResponseMessage> SendAZipOfFiles() 
{ 
    var memoryStream = new MemoryStream(); 
    var response = new HttpResponseMessage(HttpStatusCode.OK); 

    List<string> filepaths = await GetSomeFiles(); 
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
    { 
     foreach (string filepath in filepaths) 
     { 
      string filename = Path.GetFileName(filepath); 
      var entry = archive.CreateEntry(filename); 
      using (var file = File.OpenRead(filename)) 
      using (var entryStream = entry.Open()) 
      { 
        await file.CopyToAsync(entryStream); 
      } 
     } 
    } 
    memoryStream.Position = 0; 
    response.Content = new StreamContent(memoryStream); 
    response.Content.Headers.ContentLength = memoryStream.Length; 
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = "TheFile.zip") 
    }; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip"); 
    return response; 
} 
0

それは私の問題はtypescriptです側にあったが。

string filename = Path.GetFileName(filepath); 
using (StreamReader reader = new StreamReader(filepath)) 
using (StreamWriter writer = new 
StreamWriter(archive.CreateEntry(filename).Open())) 
{ 
    writer.Write(reader.ReadToEnd()); 
} 

単純に:

私は交換し、コードを変更しました

archive.CreateEntryFromFile(filepath, Path.GetFileName(filepath)); 
関連する問題