2013-08-14 2 views
0

Мне нужно разобрать и пользовательский сохранить (не используя SaveAs) HttpPostedFileBase в моем приложении asp.net mvc.Как читать HttpInputStream дважды

Мой код:

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

     .... 
    } 
+0

Если возможно, вы можете сначала сохранить файл в временном расположении. Затем откройте поток файлов в файл temp и попробуйте разбор. Если синтаксический анализ не удаляет файл temp, если он передает файл перемещения в его постоянное место. Это было бы более эффективно. –

+0

Не могли бы мы увидеть код для MapParser, что он делает с потоком? В противном случае, почему бы не попробовать сначала сохранить поток, а затем сбросить положение пара до 0 и с помощью MapParser? – Dutts

+0

Несомненно, я добавил код –

ответ

1

В общем случае, это не следует считать, что Stream с повторимы; это относится к , в частности, когда речь идет о данных, поступающих по проводам. Если вы прочитали данные в Parse, то вы уничтожили данные: он ушел.

Варианты:

  • буфер все данные в памяти (Stream.CopyTo в MemoryStream) - возможно, если ограничить его до умеренных размеров, но не очень хороший вариант, если данные могут быть огромные
  • выполнить Parseпри записи в файловую систему; эффективный, но трудно реализовать
  • буфера данных на диск (в основном, делает SaveFileпервым), а затем проверить содержимое, которое вы написали (записать его в другое место, а затем удалить файл, если содержимое не является хорошим , или переместите файл, если содержимое в порядке)
+0

Спасибо, нет, у меня нет больших данных. Что касается меня, мне нужно скопировать мой поток в MemoryStream, но после Parse, когда я установил позицию на 0, я получил исключение, что мой поток уже закрыт –

+0

«Если вы читаете данные в Parse, то у вас есть потреблял данные: он ушел ». Но если я назвал stream.SaveAs после Parse - он работает хорошо. –