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

Stream一般的なケースでは、 s が反復可能であると想定すべきではありません。これは特に、ネットワーク経由で送信されるデータについて話す場合に当てはまります。でデータを読み取った場合は、データParse消費したことになります。データはなくなっています。

オプション:

  • メモリ内のすべてのデータを ( Stream.CopyToa にMemoryStream) バッファリングします - 適度なサイズに制限する場合は可能ですが、データが巨大になる可能性がある場合は適切なオプションではありません
  • ファイルシステムへのParse 書き込み中に実行します。効率的だが実装が難しい
  • データをディスクにバッファリングし(基本的にはSaveFile 最初の を行います)、書き込んだ内容を確認します(別の場所に書き込んで、内容が良くない場合はファイルを削除し、内容が問題ない場合はファイルを移動します)。
于 2013-08-14T07:15:31.903 に答える