【问题标题】:Uploading a File: MemoryStream vs. File System上传文件:MemoryStream 与文件系统
【发布时间】:2013-03-24 09:03:26
【问题描述】:

在我正在创建的商业应用程序中,我们允许管理员上传包含某些数据的 CSV 文件,这些数据会被解析并输入到我们的数据库中(正在发生所有适当的错误处理等)。

作为升级到 .NET 4.5 的一部分,我不得不更新这段代码的一些方面,并且在我这样做的同时,我遇到了使用 MemoryStream 处理上传文件的人的this answer,而不是临时保存到文件系统。我没有真正的理由去改变(甚至可能更糟糕),但我想尝试一下来学习一下。所以,我迅速换掉了这段代码(由于上传了其他元数据,从强类型模型中):

HttpPostedFileBase file = model.File;
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"), fileName);
file.SaveAs(path);

CsvParser csvParser = new CsvParser();
Product product = csvParser.Parse(path);

this.repository.Insert(product);
this.repository.Save();

return View("Details", product);

到这里:

using (MemoryStream memoryStream = new MemoryStream())
{
    model.File.InputStream.CopyTo(memoryStream);

    CsvParser csvParser = new CsvParser();
    Product product = csvParser.Parse(memoryStream);

    this.repository.Insert(product);
    this.repository.Save();

    return View("Details", product);
}

不幸的是,当我这样做时,事情就中断了——我的所有数据都带有空值,而且 MemoryStream 中似乎实际上没有任何内容(尽管我对此并不积极)。我知道这可能是一个长镜头,但有什么明显的我在这里遗漏或我可以做些什么来更好地调试它?

【问题讨论】:

    标签: asp.net-mvc file-upload


    【解决方案1】:

    您需要添加以下内容:

    model.File.InputStream.CopyTo(memoryStream);
    memoryStream.Position = 0;
    
    ...
    
    Product product = csvParser.Parse(memoryStream);
    

    当您将文件复制到 MemoryStream 中时,指针会移动到流的末尾,因此当您尝试读取它时,您会得到一个空字节而不是流数据。您只需要将位置重置为起点,即 0。

    【讨论】:

      【解决方案2】:

      我认为问题在于您的 memoryStream 的位置设置为末尾,我猜您的 CSVParser 仅从该点开始处理,没有数据。

      要解决此问题,您只需在使用 csvParser 解析它之前将 memoryStream 位置设置为 0。

      memoryStream.Position = 0;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 2014-09-16
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        相关资源
        最近更新 更多