私は、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;
そして、これは私の第二の方法で得るものですアップロード時にファイル名のGUIDを生成し、これについては、それが保存されているもの
[HttpPost]
public string Save(SaveViewModel model)
{
//Get the file from session
var file = Session["file"] as HttpPostedFileBase;
「誰かに別のやり方がありますか?」バグを修正するのはどうですか?セッションはデータをランダムに破損しません。あなたはミスを犯しました。コードを投稿してください。 – usr
ランダムに生成された名前を使用してファイルを一時ディレクトリに移動し、その名前をセッションに格納するのが最善の方法です。ユーザが中間にいる場合、残ったファイルを削除するには、Session_Endイベントに登録することを確かめてください。 –
@usrセッションの状態を表示するための情報を追加します。 –