2011-01-18 12 views
6

質問の最初の部分:asp.net MVC FileStreamResult

私はDBの情報を持っていると私は、DBから取得し、クライアントへ.txtファイルとして保存します。

私はRegular asp.netでやっています。 mvcではまだありません。私の情報はイメージではありません。私はクライアントにファイルをダウンロードしたい

:人々

についてこの情報は、私がThis site

に質問の後半部分を見ました。 1つのファイルをダウンロードする際に問題はありませんが、1つの要求で3つのファイルを同時にダウンロードしたいと思います。しかし、それはできませんでした。だから私はzipファイルを作成し、リンクを生成することにしました。ユーザーがリンクをクリックすると、ユーザーにダウンロードされます。

あなたはどう思いますか?この方法でやるのはいいですか?質問の

第三部:大成功をダウンロードした後、私はカタログから古い.zipファイルを削除するにはどうすればよい(新)

?または別の方法。サーバー上で動作するサービスで言うことができます。

+0

ありがとうございました。私の質問 – AEMLoviji

答えて

12

あなたは、データベースから情報を取得し、クライアントはそれをダウンロードすることができます応答ストリームに書き込みます以下のコントローラのアクションを持つことができます:

public ActionResult Download() 
{ 
    string info = Repository.GetInfoFromDatabase(); 
    byte[] data = Encoding.UTF8.GetBytes(info); 
    return File(data, "text/plain", "foo.txt"); 
} 

とあなたのビューでは、このアクションへのリンクを提供:

<%= Html.ActionLink("Downoad file", "Download") %> 
+0

はい、私はそれをチェックしました。しかし、Encoding.UTF8.GetBytes()はstringを文字列として受け取ります。 Repository.GetInfoFromDatabase()からの私の結果。単純な文字列ではありません。それはFirstName、LastName、Patronymicとしての情報になることができます... – AEMLoviji

+0

@AEMLoviji、この場合、サービスレイヤーを使用する必要があります。このサービス・レイヤーは、リポジトリー・メソッドを呼び出し、モデルからクライアントに情報を送信するストリングまたは任意のフォーマットを生成します。次に、コントローラは、文字列とストリームをクライアントに返すサービスレイヤメソッドを呼び出します。 –

+0

はい、シンプルですが良い方法ではありません。私はそう思う。 IEnumreableをbyte []に​​変換する他の方法はありますか? – AEMLoviji

3

返された一時ファイルは、このようなアクションフィルタを使用して削除できます。次に、MVCアクションメソッドに属性を適用します。

public class DeleteTempFileResultFilter : ActionFilterAttribute 
    { 
     public override void OnResultExecuted(ResultExecutedContext filterContext) 
     { 
      string fileName = ((FilePathResult)filterContext.Result).FileName; 

      filterContext.HttpContext.Response.Flush(); 
      filterContext.HttpContext.Response.End(); 

      System.IO.File.Delete(fileName); 
     } 
    }