【问题标题】:Reading stream twice?读流两次?
【发布时间】:2011-05-15 01:34:53
【问题描述】:

当我从我的网站上传图片后,我需要做 2 件事:

  1. 读取图片尺寸
  2. 将图像保存到数据库

我做的第一件事就是将图像流读入 Image 对象,如下所示:

var file = Request.Files["logo"];

Image FullsizeImage = Image.FromStream(file.InputStream);

接下来我要做的是将“文件”对象保存到数据库(LINQ to SQL)。但是,当我尝试将图像保存到数据库时,文件中的流在流的末尾有它的位置,并且似乎没有数据存在。

我知道我应该如何重置流并将其放回位置 0,但我该如何以最有效和正确的方式做到这一点?

【问题讨论】:

    标签: c# .net .net-core stream


    【解决方案1】:

    嗯,最简单的方法是:

    file.InputStream.Position = 0;
    

    ...假设流支持搜索。但是,如果您不小心,这可能会对 Image 产生有趣的影响 - 因为它会保留对流的引用。

    最好将数据加载到一个字节数组中,然后在需要时从中创建两个单独的MemoryStream 对象。如果您使用的是 .NET 4,则很容易将一个流复制到另一个流:

    MemoryStream ms = new MemoryStream();
    Request.Files["logo"].InputStream.CopyTo(ms);
    byte[] data = ms.ToArray();
    

    【讨论】:

    • 你的意思是file.InputStream.Position = 0; ?
    • @danielovich:是的,我做到了 - 抱歉,已修复。
    【解决方案2】:

    除了 Jon 的回答:如果您有 StreamReader,则没有 Position 参数 - 您需要访问它的 BaseStream

    为此,您可以使用一点扩展方法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 的位置开始,例如,如果您想在再次读取流时跳过标题,则可以传递所需的开始位置。

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 2012-03-19
      • 2019-07-15
      • 2021-06-04
      • 2021-11-17
      • 2010-09-13
      • 2014-03-25
      • 1970-01-01
      相关资源
      最近更新 更多