2012-03-07 96 views
1

我正在寻找一种简单方法来设置Http响应中动态创建图像的内容长度。在ASP.NET中设置动态创建图像的内容长度

Response.ContentType = "image/jpeg"; 
Response.Clear(); 
Response.BufferOutput = true; 
... 
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); 
... 
bmp.Save(Response.OutputStream, ImageFormat.Jpeg); 
Response.Flush(); 

试图做的设置内容长度

Response.AddHeader("Content-Length", Response.OutputStream.Length()) 

给人意想不到的效果。

另外我不希望将文件复制到另一个流(比如MemoryStream)并将其复制到输出流。

任何想法?

谢谢。

+1

您的HTTP服务器类是否支持分块编码?如果是这样,那就使用它,你不需要设置大小,你仍然允许连接保持活着。 – 2012-03-07 08:43:52

+0

@Eden,您必须将图像存储到mem流中并测量内容长度。 OTOH,为什么不把图像推到磁盘上,然后使用Reponse.WriteFile(或TransmitFile)从那里提供图像。这种方式只有在你必须多次服务于同一个映像时才有意义(基本上你正在将它缓存到磁盘上)到(可能)多个用户。 – VinayC 2012-03-07 09:29:33

+0

@DavidSchwartz - 从文档看来,IIS 7.5支持分块编码,尽管我在响应头文件中没有看到它。我将不得不调查这个问题。谢谢! – Eden 2012-03-11 06:33:23

回答

4
long bmpByteSize; 
using (var ms = new MemoryStream(estimatedLength /* you can instantiate without this parameter at all */)) 
{ 
    bmp.Save(ms, ImageFormat.Png); 
    bmpByteSize= ms.Length; 
} 
+0

这是我试图避免的确切的事情。 – Eden 2012-03-07 15:36:12

+0

你必须。另外,请参阅@David Schwartz的评论;你没有回应他。 – 2012-03-07 20:06:45

+0

没有。有很多选择。例如,我可以编写我自己的HttpResponse类来完成我所需要的。 – Eden 2012-03-11 06:39:13