2013-09-12 4 views
32

Я не понимаю, что я здесь делаю неправильно. Я генерирую пару потоков памяти и в режиме отладки вижу, что они заполнены. Но когда я пытаюсь скопировать MemoryStream в FileStream, чтобы сохранить файл fileStream не заполнен, а файл 0 байтов (пустой).Скопируйте файл MemoryStream в FileStream и сохраните файл?

Вот мой код

if (file.ContentLength > 0) 
{ 
    var bytes = ImageUploader.FilestreamToBytes(file); // bytes is populated 

    using (var inStream = new MemoryStream(bytes)) // inStream is populated 
    { 
     using (var outStream = new MemoryStream()) 
     { 
      using (var imageFactory = new ImageFactory()) 
      { 
       imageFactory.Load(inStream) 
          .Resize(new Size(320, 0)) 
          .Format(ImageFormat.Jpeg) 
          .Quality(70) 
          .Save(outStream); 
      } 

      // outStream is populated here 

      var fileName = "test.jpg"; 

      using (var fileStream = new FileStream(Server.MapPath("~/content/u/") + fileName, FileMode.CreateNew, FileAccess.ReadWrite)) 
      { 
       outStream.CopyTo(fileStream); // fileStream is not populated 
      } 
     } 
    } 
} 
+0

Вы уверены, что outStream содержит данные изображения? Я думаю, проблема в .Save (outStream); можете ли вы отправить стек вызовов. –

+1

@BassamAlugili na man, я проверил в режиме отладки. Он заселен. 'outStream.Position = 0' была проблема, мне нужно было установить ее. – sed

ответ

49

Вам нужно сбросить позицию потока перед копированием.

outStream.Position = 0; 
outStream.CopyTo(fileStream); 

Вы использовали outStream при сохранении файла с помощью imageFactory. Эта функция заполнила outStream. При заполнении outStream позиция устанавливается в конец заполненной области. Это значит, что, когда вы продолжаете записывать байты в пар, он не отменяет существующие байты. Но затем, чтобы прочитать его (для целей копирования), вам нужно установить позицию в начало, чтобы вы могли начать чтение с самого начала.

+0

Мне интересно, зачем ему нужна эта позиция = 0; он просто создал outStream и не использовался; Почему он должен ошибаться? –

+7

@BassamAlugili Он использовал outsteam при сохранении файла с помощью imageFactory. Эта функция заполняла outsteam. При заполнении выходного положения позиция устанавливается в конец заполненной области. Это так, что, когда вы продолжаете писать байты в пар, он не переопределяет существующие байты. Но затем, чтобы прочитать его (для целей копирования), вам нужно установить позицию в начало, чтобы вы могли начать чтение с самого начала. – SynerCoder

+0

Спасибо, очень полезная информация. –

12

Если ваша цель состоит в том, чтобы просто сбросить поток памяти в физический файл (например, для просмотра содержимого) - это может быть сделано в один ход:

memoryStream.Position = 0; 
System.IO.File.WriteAllBytes(@"C:\\filename", memoryStream.ToArray()); 
Смежные вопросы