如何流式字节数组图像?

时间:2011-06-06 12:36:00

标签: c# asp.net image stream

由于一些奇怪的原因,即使没有代码,一个已经使用IE6 的五年内部 asp.net网络应用突然出现问题变化。某些用户不会出现某些正在流回Web浏览器的图像。

我不知道为什么这突然发生或者原因是什么 - 但是作为搜索的一部分,我正在考虑用于流回图像的代码是否存在缺陷。

图像保存在内存中是一个字节数组,然后使用以下代码进行流式传输。这是流回图像的最佳方式吗?

Response.Clear();
Response.ClearHeaders();
Response.ClearContent();        

// Work out file type
switch( Path.GetExtension( imageFilename ).ToLower() )
{
    case ".jpg":
    case ".jpeg":
        Response.ContentType = "image/jpeg";
        break;
    case ".gif":
        Response.ContentType = "image/gif";
        break;
    default:
        Response.ContentType = "binary/octet-stream";
        break;  
}

Response.AddHeader("Content-Length", imageBytes.Length.ToString() );
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite( imageBytes );
Response.End();

不显示页面中的图像,而是显示红叉。这只发生在页面上显示的动态生成的图像上,而不是静态链接的图像。

如果我尝试在它自己的窗口中打开图像,我要么看到图像,要么看到一堆gobbledygook文本(我猜这意味着MIME类型没有被浏览器设置/拾取)

2 个答案:

答案 0 :(得分:1)

Response.End()通常很糟糕,因为它会中止IIS线程,即使它位于Flush()的中间。

使用Response.Flush()后跟Response.Close()来确保将所有内容发送到客户端。

答案 1 :(得分:0)

我可能错了,但我认为Content-Length应该包含正文的长度。 Response.BinaryWrite将对数据进行base64编码,该数据将比标题中的byte[]长度更长。