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@丹尼洛维奇:是的,我做了-对不起,修好了。