2016-04-06 5 views
0

私は、Asp.NET MVC 4のアプリケーションを使用して、ユーザーが処理するファイルを2回アップロードします。私はヘッダーと行の数を最初に見つけ、2番目のものは(ユーザーからの入力に応じて)オブジェクトにマップしました(これは.csvファイルなので、ヘッダーを解析する必要があります)。私は、ユーザーにヘッダと行数を送信し、その後、私は私が処理する前に、彼は私にいくつかの他の情報を伝える必要がありアップロードされたファイルをアクションメソッドの呼び出しの間に保存する方法

[HttpPost] 
public string Upload() 
{ 
    //I get the file from HttpRequestBase 
    if (Request.Files.Count > 0) 
    { 
     var file = Request.Files[0]; 
     //Some logic... 
    } 
} 

:私はこの(方法はAJAXによって消費されている)のような何かをしましたもう一度私のファイル。

[HttpPost] 
public string Process(SaveViewModel model) 
{ 
    //I don't want to make the user upload the file again and I want to use it here. 
} 

私はセッションでファイルを保存しようとした(はい、私は良い方法ではありません知っている)が、私はファイルを取得しようとしたとき、それは、働いていない、それはContentLenght = 0が付属して、それは名前を保持し、内容を除くすべてが空でした。誰かがそれを行う別の方法がありますか?

EDIT 1:セッションで何が起こっているかを確認するコードを表示しています。

[HttpPost] 
    public string PreUpload() 
    { 
     //Check if request has files 
     if (Request.Files.Count > 0) 
     { 
      var file = Request.Files[0]; 
      //Process the file using CsvHelper 
      using (var sr = new StreamReader(file.InputStream)) 
      {         
       //Initialize the CsvReader 
       var reader = new CsvReader(sr); 
       reader.Read(); 
       //Get the Headers 
       var headers = reader.FieldHeaders; 
       //get how many lines does the file has to inform the user 
       sr.DiscardBufferedData(); 
       sr.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); 
       var lines = sr.ReadToEnd().Split(new char[] { '\n' }); 
       var linesCount = lines.Count() - 1; 
       //Create a ViewModel to send to my view 
       var viewModel = new UploadViewModel() { Headers = headers, ClientsCount = linesCount }; 
       var json = new JavaScriptSerializer().Serialize(viewModel); 
       //Save in sesion 
       Session["file"] = file; 
       //Return my viewModel in a json 
       return json; 

If I break point before I assign the value to the Session

そして、これは私の第二の方法で得るものですアップロード時にファイル名のGUIDを生成し、これについては、それが保存されているもの

[HttpPost] 
public string Save(SaveViewModel model) 
{ 
    //Get the file from session 
    var file = Session["file"] as HttpPostedFileBase; 

If I break point after retrieving

+0

「誰かに別のやり方がありますか?」バグを修正するのはどうですか?セッションはデータをランダムに破損しません。あなたはミスを犯しました。コードを投稿してください。 – usr

+3

ランダムに生成された名前を使用してファイルを一時ディレクトリに移動し、その名前をセッションに格納するのが最善の方法です。ユーザが中間にいる場合、残ったファイルを削除するには、Session_Endイベントに登録することを確かめてください。 –

+0

@usrセッションの状態を表示するための情報を追加します。 –

答えて

0

データベースも。プロセスを制御するために、ビューモデルにキー(guid)があります。致命的なエラーが発生した場合、またはユーザーがタスクを異常終了した場合、key(guid)が完全に処理されていないファイルを削除するには、サブルーチンを実行する必要があります(n回)。

関連する問題