读两次流?

时间:2010-11-24 11:56:04

标签: c#

当我从我的网站上传图像时,我需要做两件事:

  1. 阅读图片尺寸
  2. 将图像保存到数据库
  3. 我做的第一件事就是将图像流读入Image对象,如下所示:

    var file = Request.Files["logo"];
    
    Image FullsizeImage = Image.FromStream(file.InputStream);
    

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

    我知道我应该重新设定流并将其重新置于0位置,但我该如何做到最有效率和最正确的方式呢?

2 个答案:

答案 0 :(得分:48)

嗯,最简单的方法是:

file.InputStream.Position = 0;

...假设流支持寻求。但是,如果您不小心,那可能会对Image做一些有趣的事情 - 因为它会保留对流的引用。

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

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

答案 1 :(得分:0)

除了乔恩的回答:如果您有StreamReader,则没有排名参数-相反,您需要访问其BaseStream

为此,您可以使用一些扩展方法:

public static void ResetStreamReader(this StreamReader sr, long position = 0)
{
    if (sr == null) return;
    sr.BaseStream.Position = position;
}

将其放在您的公共静态扩展类中,然后可以像这样使用它:

sr.ResetStreamReader();

或者,如果要从> 0开始,则可以传递所需的开始位置,例如,如果要在再次读取流时跳过标题。