来自Stream的图片 - 仅适用于首页加载

时间:2015-06-03 16:40:44

标签: c# asp.net

我们有一个代码片段,它将Stream转换为byte [],然后将其显示为aspx页面中的图像。

问题是当第一次加载页面时正在显示图像,但是没有显示以后的请求(重新加载等)。

我观察到的唯一差异是“输入”中的“流”位置。 (ConvertStreamtoByteArray)首次为0,后续调用为> 0.我该如何解决这个问题?

context.Response.Clear();
context.Response.ContentType = "image/pjpeg";
context.Response.BinaryWrite(ConvertStreamtoByteArray(imgStream));
context.Response.End();

private static byte[] ConvertStreamtoByteArray(Stream input)
{
    var buffer = new byte[16 * 1024];
    using (var ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}

我认为来源是:Creating a byte array from a stream 我认为代码片段来自上面的链接,我看到除了方法名称之外的所有匹配。

1 个答案:

答案 0 :(得分:0)

您(很可能)持有对imgStream的引用,因此每次调用ConvertStreamtoByteArray时都会使用相同的流。

问题是流跟踪他们的Position。当流是新的时,它从0开始,当你读取整个流时,它从结尾开始。

在这种情况下,解决方案通常是在复制流内容之前将Position设置回0。

在您的情况下,您应该1)在第一次需要时将imgStream转换为字节数组2) 缓存此字节数组而不是流 3)从此时开始处置并丢弃imgStream和4)将字节数组传递给Response

请参阅,当您从互联网上复制代码时会发生这种情况。像这样奇怪的东西,反复将相同的流转换为字节数组(浪费时间!),最终你没有使用the framework to do your work for you。手动复制流是如此的2000年代。