我在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;
这就是我在第二种方法中得到的结果
[HttpPost]
public string Save(SaveViewModel model)
{
//Get the file from session
var file = Session["file"] as HttpPostedFileBase;
答案 0 :(得分:0)
如何为文件名生成Guid,因此,上传时它也会保存在数据库中。您将拥有viewmodel上的键(guid)来控制进程。如果发生致命错误或用户放弃了该任务,则必须执行子程序(当天n次)以删除密钥(guid)未完全处理的文件。