Скопируйте MemoryStream в FileStream и сохраните файл?
Я не понимаю, что я делаю здесь не так. Я генерирую пару потоков памяти и в режиме отладки вижу, что они заполнены. Но когда я пытаюсь скопировать MemoryStream
в FileStream
чтобы сохранить файл fileStream
не заполнен, и файл имеет длину 0 байт (пусто).
Вот мой код
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
}
}
}
}
2 ответа
Вам необходимо сбросить положение потока перед копированием.
outStream.Position = 0;
outStream.CopyTo(fileStream);
Вы использовали outStream
при сохранении файла с помощью imageFactory
, Эта функция заполнила outStream
, При заполнении outStream
позиция устанавливается до конца населенного пункта. Это так, что когда вы продолжаете записывать байты в steam, он не переопределяет существующие байты. Но затем, чтобы прочитать его (в целях копирования), вам нужно установить позицию на начало, чтобы вы могли начать чтение с самого начала.
Если ваша цель - просто сбросить поток памяти в физический файл (например, посмотреть содержимое) - это можно сделать одним движением:
memoryStream.Position = 0;
System.IO.File.WriteAllBytes(@"C:\\filename", memoryStream.ToArray());
Еще одна альтернатива CopyTo
является WriteTo
,
Преимущество:
Нет необходимости сбрасывать положение.
Использование:
outStream.WriteTo(fileStream);
Записывает все содержимое этого потока памяти в другой поток.