2017-07-18 15 views
1

返されたCSVファイルを呼び出して保存できるWebサービスがあります。すべてが正常に動作しているようです。私が今興味を持っていることは、ダウンロードするために複数のCSVファイルを返すことです。これを処理する適切な方法は何ですか?私はそれらをパッケージ化する方法が必要であると推測しています(おそらくzip?)?抽象的なファイル名及びコンテンツへWebサービスAPIは、複数のCSVファイルをダウンロード/保存するために使用します。

次のモデルを使用して
[HttpPost] 
[Route("OutputTemplate")] 
public HttpResponseMessage OutputTemplate() 
{ 
    HttpResponseMessage msg = new HttpResponseMessage(); 
    string body = this.Request.Content.ReadAsStringAsync().Result; 
    try 
    { 
     string contents = DoStuff(body) // get contents based on body 

     MemoryStream stream = new MemoryStream(); 
     StreamWriter writer = new StreamWriter(stream); 
     writer.Write(contents); 
     writer.Flush(); 
     stream.Position = 0; 

     msg.StatusCode = HttpStatusCode.OK; 
     msg.Content = new StreamContent(stream); 
     msg.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv"); 
     msg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
      { 
       FileName = "fileexport" 
      }; 

     return msg; 

     } 
     ... 
    } 
+1

はいzipファイル/アーカイブにそれらをパッケージ化していただきありがとうございます – Nkosi

+0

@Nkosiをダウンロードし、あなたは、私が参照できることを知っているか良いリソースに私を指すことができますか? –

+1

ここで私が答えを見てくださいhttps://stackoverflow.com/questions/36776704/ziparchive-returning-empty-folder-c-sharp/36777930#36777930あなたはあなたのニーズに合わせてそれを修正することができるはずです – Nkosi

答えて

1

public class FileModel { 
    public string FileName { get; set; } 
    public byte[] FileContent { get; set; } 
} 

次の拡張は、代わりに実施例のAPIコントローラをファイルの内容それと

public static class ZipArchiveExtensions { 

    public static Stream Compress(this IEnumerable<FileModel> files) { 
     if (files.Any()) { 
      var ms = new MemoryStream(); 
      var archive = new ZipArchive(stream: ms, mode: ZipArchiveMode.Create, leaveOpen: false); 
      foreach (var file in files) { 
       var entry = archive.add(file); 
      } 
      ms.Position = 0; 
      return ms; 
     } 
     return null; 
    } 

    private static ZipArchiveEntry add(this ZipArchive archive, FileModel file) { 
     var entry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest); 
     using (var stream = entry.Open()) { 
      stream.Write(file.FileContent, 0, file.FileContent.Length); 
     } 
     return entry; 
    }   
} 

を圧縮するために導き出されましたアクションはこのように見えるかもしれません。

public class ExampleApiController : ApiController { 
    public async Task<IHttpActionResult> OutputTemplate() { 
     IHttpActionResult result = BadRequest(); 
     var body = await Request.Content.ReadAsStreamAsync();     
     List<FileModel> files = DoSomething(body); 
     if (files.Count > 1) { 
      //compress the files. 
      var archiveStream = files.Compress(); 
      var content = new StreamContent(archiveStream); 
      var response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
      response.Content = content; 
      response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip"); 
      response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { 
       FileName = "fileexport.zip" 
      }; 
      result = ResponseMessage(response); 
     } else if (files.Count == 1) { 
      //return the single file 
      var fileName = files[0].FileName; //"fileexport.csv" 
      var content = new ByteArrayContent(files[0].FileContent); 
      var response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
      response.Content = content; 
      response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv"); 
      response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { 
       FileName = fileName 
      }; 
      result = ResponseMessage(response); 
     } 
     return result; 
    } 

    private List<FileModel> DoSomething(System.IO.Stream body) { 
     //...TODO: implement file models 
     throw new NotImplementedException(); 
    } 
} 
関連する問題