ここで私が間違っていることを理解していません。いくつかのメモリストリームを生成しますが、デバッグモードではそれらが読み込まれていることがわかります。しかし、ファイルを保存するために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
}
}
}
}
コピーする前に、ストリームの位置をリセットする必要があります。
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);
このメモリストリームの内容全体を別のストリームに書き込みます。