如何在动作方法调用之间保持上传文件

时间:2016-04-06 20:02:34

标签: c# asp.net asp.net-mvc http csv

我在Asp.NET MVC 4中有一个应用程序,用户上传要处理的文件2次。我第一次找到标题和行数,第二次(取决于用户的一些输入)我将该文件映射到一个对象(It' sa .csv文件,我需要解析标题) 。我有这样的事情(这些方法是由AJAX消费的):

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

我将标题和行数发送给用户,然后我需要他告诉我一些其他信息,然后再处理我的文件。

[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. 
}

我尝试将文件存储在Session中(是的,我知道这不是一个好习惯)但是它没有用,当我尝试检索文件时,它附带ContentLenght = 0,它保留了名称和所有内容,但内容为空。有没有人有另一种方法呢?

编辑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

这就是我在第二种方法中得到的结果

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

If I break point after retrieving

1 个答案:

答案 0 :(得分:0)

如何为文件名生成Guid,因此,上传时它也会保存在数据库中。您将拥有viewmodel上的键(guid)来控制进程。如果发生致命错误或用户放弃了该任务,则必须执行子程序(当天n次)以删除密钥(guid)未完全处理的文件。