我不明白我在做什么错。我生成了几个内存流,并在调试模式下看到它们已填充。但是,当我尝试将MemoryStream
复制到FileStream
以保存文件时fileStream
未填充,并且文件的长度为0bytes(空)。
这是我的代码
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
时,位置设置为填充区域的末尾。这样一来,当您继续向字节写入字节时,它不会覆盖现有字节。但是然后要阅读(出于复制目的),您需要将位置设置为起始位置,以便可以从起始位置开始阅读。
如果您的目标只是将内存流转储到物理文件(例如,查看内容),则可以一举完成:
System.IO.File.WriteAllBytes(@"C:\\filename", memoryStream.ToArray());
也不需要先设置流的位置,因为根据https://docs.microsoft.com/en-us/dotnet/api/system.io.memorystream.toarray?view=netframework-4.7.2下面的@BaconBits注释,.ToArray()操作显式忽略了该位置。
CopyTo
的另一种选择是WriteTo
。