如何读取HttpInputStream两次

时间:2013-08-14 07:10:13

标签: c# asp.net stream

我需要在我的asp.net mvc应用程序中解析和自定义保存(不使用SaveAsHttpPostedFileBase

我的代码是:

private ReportViewModel LoadFile(Stream stream, string fileName)
{
   MapParser mapParser = new MapParser(stream);
   try
   {
       mapParser.Parse();
   }
   ....
   stream.position = 0;
   SaveFile(memStream2, Server.MapPath("~/Uploads/Maps/" +
                (map.Id + "." + ext)));
   ....
}

public static void SaveFile(Stream inputStream, string filePath)
{
   using (Stream file = System.IO.File.Create(filePath))
   {
      inputStream.CopyTo(file);
   }
 }


LoadFile(loadMapVM.MapFile.InputStream, loadMapVM.MapFile.FileName)

因此,我的Parse()方法工作正常,但在SaveAs方法之后创建0字节的文件。 我想,我应该在Parse()之后克隆或重新打开我的流。但是我该怎么做呢?

修改

我的MapParser代码:

        public MapParser(Stream stream)
        {
            using(stream)
            {
                IWorkbook workBook = null;

                if (POIXMLDocument.HasOOXMLHeader(stream))
                    workBook = new XSSFWorkbook(stream);

                if (POIFSFileSystem.HasPOIFSHeader(stream))
                    workBook = new HSSFWorkbook(stream);

                if (workBook == null)
                    throw new MapParserException(MapParserError.InvalidFileFormat);

                mSheet = workBook.GetSheetAt(0);
            }
        }

    public void Parse()
    {
        mData = new Map();

        mData.UnitCode = mSheet.GetRow(0).GetCell(5).GetSafeValue();
        if (mData.UnitCode == "")
            throw new MapParserException(MapParserError.NoUnitCode, 0, 5);

        ....
    }

1 个答案:

答案 0 :(得分:1)

在一般情况下,不应假设Stream是可重复的;在讨论通过网络传输的数据时,这尤其适用 。如果你在Parse中读取数据,那么你已经消耗了数据:它已经消失了。

选项:

  • 将内存中的所有数据(Stream.CopyTo缓冲到MemoryStream) - 如果将其限制为中等大小,则可能,但如果数据可能很大则不是一个好的选择
  • 在将写入文件系统时执行Parse ;高效但难以实施
  • 将数据缓冲到磁盘(基本上先执行SaveFile ),然后检查您编写的内容(将其写入其他位置,然后如果内容不好则删除文件,或者如果内容正常则移动文件)