0

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

我的代码是:

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);

        ....
    }
4

1 回答 1

2

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

选项:

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