1、 簡介
做爲ASP.NET基本對象之一的Response對象不但能夠經過Write()方法直接在頁面上輸出字符串數據,並且還能夠使用BinaryWrite()方法直接顯示二進制表示的數據,如圖像、圖片等。
本文示例小工程將向你展現如何使用Response對象在ASP.NET 2.0 Web頁面中輸出直接存儲在SQL Server 2005數據庫中的圖像數據。
【注意】在本例中,咱們沒有討論僅在SQL Server 2005表格中存儲圖像的URL的情形。由於這種情形是實際開發中被廣爲採用的方法,因此,讀者不難在Web上搜到相應的使用案例。
首先,讓咱們來分析一個簡單的直接在Web頁面上繪製並輸出圖像數據的例子。
2、 直接在Web頁面上繪製並輸出圖像數據
下面的代碼示例在請求頁面時將繪製三個部分重疊的矩形。該代碼首先將ContentType屬性設置爲p_w_picpath/jpeg,以便將整個頁面呈現爲一幅JPEG圖像。第二步,該代碼調用Clear方法以確保不會將無關的內容(包括標頭)與此響應一同發送。第三步,該代碼將BufferOutput屬性設置爲true,從而使該頁面在徹底處理以後再發送到發出請求的客戶端。第四步,建立兩個用於繪製矩形的對象,即Bitmap和Graphics對象。在該頁中建立的變量將做爲繪製矩形的座標和在最大的矩形中顯示的字符串。
在繪製三個矩形和其中顯示的字符串時,將Bitmap保存到與OutputStream屬性相關聯的Stream對象中,並將其格式設置爲JPEG。接下來,該代碼調用Dispose和Dispose方法來釋放資源—這些資源爲兩個繪製對象所使用。最後,該代碼調用Flush方法將緩衝的響應發送到請求客戶端。
完整的實現代碼以下所示:
<%
@ Page Language
=
"
C#
"
%>
<%
@ import Namespace
=
"
System.Drawing
"
%>
<%
@ import Namespace
=
"
System.Drawing.Imaging
"
%>
<%
@ import Namespace
=
"
System.Drawing.Drawing2D
"
%>
<
script runat
=
"
server
"
>
private
void
Page_Load(
object
sender, EventArgs e)
...
{ //設置頁面的content type爲JPEG文件 //而且清除全部的響應頭部信息 Response.ContentType = "p_w_picpath/jpeg"; Response.Clear(); //對響應做出緩衝以便處理完成後發送頁面 Response.BufferOutput = true; //建立一字體風格 Font rectangleFont = new Font( "Arial", 10, FontStyle.Bold); //建立整數變量 int height = 100; int width = 200; //建立一個隨機數字生成器而且基於它建立 //變量值 Random r = new Random(); int x = r.Next(75); int a = r.Next(155); int x1 = r.Next(100); //建立一張位圖而且使用它建立一個 //Graphics對象 Bitmap bmp = new Bitmap( width, height, PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(bmp); g.SmoothingMode = SmoothingMode.AntiAlias; g.Clear(Color.LightGray); //使用這個Graphics對象繪製3個矩形 g.DrawRectangle(Pens.White, 1, 1, width-3, height-3); g.DrawRectangle(Pens.Aquamarine, 2, 2, width-3, height-3); g.DrawRectangle(Pens.Black, 0, 0, width, height); //使用這個Graphics對象輸出一個字符串 // on the rectangles. g.DrawString( "ASP.NET Samples", rectangleFont, SystemBrushes.WindowText, new PointF(10, 40)); //在其中兩個矩形上添加顏色 g.FillRectangle( new SolidBrush( Color.FromArgb(a, 255, 128, 255)), x, 20, 100, 50); g.FillRectangle( new LinearGradientBrush( new Point(x, 10), new Point(x1 + 75, 50 + 30), Color.FromArgb(128, 0, 0, 128), Color.FromArgb(255, 255, 255, 240)), x1, 50, 75, 30); //把位圖保存到響應流中而且把它轉換成JPEG格式 bmp.Save(Response.OutputStream, ImageFormat.Jpeg); //釋放掉Graphics對象和位圖所使用的內存空間 g.Dispose(); bmp.Dispose(); //把輸出結果發送到客戶端 Response.Flush(); }
</
script
>
<
html
>
<
head
>
</
head
>
<
body
>
<
form runat
=
"
server
"
>
</
form
>
</
body
>
</
html
>
接下來,讓咱們討論本文重點—如何在ASP頁面中輸出直接存儲在數據庫中的圖像數據。
3、 事件設計
示例工程中的DispImage.aspx頁面在其初始化函數Page_Load(object sender,EventArgs e)中使用Response對象輸出一幅圖像—該圖像存儲在SQL Server 2005 Express Edition數據庫中,並用二進制表示。
在代碼中,咱們首先從數據庫PictureDB的表格PictureTab中獲取一個ID值爲1的圖片,而後使用byte數組Data保存圖片的數據。而後,咱們能夠基於以下步驟來輸出相應的圖像:
1. 設置Response對象的輸出類型;
2. 輸出圖像的文件頭;
3. 輸出圖像的二進制數據;
4. 結束輸出。若是圖片太大,還能夠使用輸出緩衝的方法。
函數Page_Load(object sender,EventArgs e)的程序代碼以下:
1
protected
void
Page_Load(
object
sender,EventArgs e)
2
...
{ /**////建立連接 3SqlConnection myConnection = new SqlConnection( 4ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString); 5/**////定義SQL語句 6string cmdText = "SELECT * FROM PictureTab WHERE PictureID='1'"; 7/**////建立Command 8SqlCommand myCommand = new SqlCommand(cmdText,myConnection); 9/**////定義DataReader 10SqlDataReader dr = null; 11try 12...{ /**////打開連接 13myConnection.Open(); 14/**////讀取數據 15dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 16} 17catch(SqlException ex) 18...{ /**////拋出異常 19throw new Exception(ex.Message,ex); 20} 21/**////定義保存數據的字節數組 22byte[] Data = null; 23while(dr.Read()) 24...{ /**////讀取數據 25Data = (byte[])dr["Data"]; 26Response.ContentType = dr["Type"].ToString(); 27} 28dr.Close(); 29//顯示圖片數據 30this.EnableViewState = false; 31/**////輸出文件頭 32Response.AppendHeader("Content-Length",Data.Length.ToString()); 33/**////輸出文件的數據 34Response.BinaryWrite(Data); 35/**////結束輸出 36Response.End(); 37}
4、 附註與小結 把上面的頁面DispImage.aspx設置爲初始頁面,而後運行上面的示例工程。此時,頁面上應該顯示一張存儲在數據庫表格中的圖片。 在實踐中,有些狀況下須要把圖像數據直接存儲在數據庫中;而有些狀況下只在數據庫存儲圖像文件的URL而把實際圖像文件存儲在服務器文件系統中則更好。從性能上看,將這種大型數據存儲爲文件確定要快一些,並且圖形人員可以更爲容易地訪問圖像並對其編輯。然而,當須要在不一樣機器間移動數據庫時,將這種大型數據存儲爲文件就會面臨最棘手的問題,由於文件很容易斷開與數據庫的鏈接。所以,若是將其直接存儲在數據庫中則明顯能夠使數據保持輕鬆的同步。總之,各有利弊,需慎重作出選擇。