C# 读两次流?
当我从我的网站上传图像时,我需要做两件事:C# 读两次流?,c#,.net,.net-core,stream,C#,.net,.net Core,Stream,当我从我的网站上传图像时,我需要做两件事: 阅读图像尺寸 将图像保存到数据库中 我要做的第一件事是将图像流读入图像对象,如下所示: var file = Request.Files["logo"]; Image FullsizeImage = Image.FromStream(file.InputStream); 接下来我要做的是将“file”对象保存到数据库(LINQ到SQL)。但是,当我试图将图像保存到数据库时,文件中的流在流的末尾有它的位置,并且似乎没有数据存在 我知道我应该重置流并将
var file = Request.Files["logo"];
Image FullsizeImage = Image.FromStream(file.InputStream);
接下来我要做的是将“file”对象保存到数据库(LINQ到SQL)。但是,当我试图将图像保存到数据库时,文件中的流在流的末尾有它的位置,并且似乎没有数据存在
我知道我应该重置流并将其放回位置0,但如何以最有效和正确的方式执行此操作?最简单的方法是:
file.InputStream.Position = 0;
。。。假设流支持查找。但是,如果您不小心,这可能会对图像产生有趣的影响,因为它会保留对流的引用
最好先将数据加载到字节数组中,然后再从中创建两个独立的MemoryStream
对象(如果仍然需要)。如果您使用的是.NET 4,则很容易将一个流复制到另一个流:
MemoryStream ms = new MemoryStream();
Request.Files["logo"].InputStream.CopyTo(ms);
byte[] data = ms.ToArray();
除了Jon的回答之外:如果您有一个StreamReader
,则没有位置参数-相反,您需要访问它的基本流
为此,您可以使用一些扩展方法ResetStreamReader
:
public static class Extension
{
public static void ResetStreamReader(this StreamReader sr, long position = 0)
{
if (sr == null) return;
sr.BaseStream.Position = position;
}
}
将它放在公共静态扩展类中,然后可以像这样使用它:
sr.ResetStreamReader();
或者,如果要从大于0的位置开始,例如,如果要在再次读取流时跳过标题,则可以传递所需的开始位置。您的意思是file.InputStream.position=0@丹尼洛维奇:是的,我做了-对不起,修好了。