2012-03-07 95 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