資料庫管理系統往往都提供二進位大對象的支援。當然,二進位對象欄位不一定非要儲存映像,它還可以儲存媒體檔案或長文字檔或其他二進位內容。
下面以從資料庫載入員工相片為例,展示一個HTTP處理常式的例子:
public class DbImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
//從查詢字串中擷取員工ID
int id = -1;
bool reaust = Int32.TryParse(ctx.Request.QueryString["id"], out id);
//如果未能從查詢字串中得到員工ID,則立即中斷Http請求的處理
if(!result)
ctx.Response.End();
//資料庫連接字串
string connString = "...";
string cmdText = "Select photo from employees where employeeid = @id";
//從資料庫中讀取photo欄位,以擷取員工相片
byte[] img = null;
SqlConnection conn = new SqlConnection(connString);
using(conn)
{
SqlCommand cmd = new SqlCommand(cmdText, conn);
cmd.Parameters.AddWithValue("@id", id);
conn.Open();
img = (byte[])cmd.ExecuteScalar();
conn.Close();
}
if(img != null)
{
//設定HTTP標題中的ContextType欄位,表明body中的資料為映像類型
ctx.Response.ContextType = "image/jpeg";
//輸出映像到瀏覽器
ctx.Response.BinaryWrite(img);
}
}
public bool IsReusable
{
get { return true; }
}
}
這段代碼做了幾點假設:首先,名為photo的欄位儲存的是映像資料,且以JPEG格式儲存;其次,映像是通過預定義的連接字串從固定的資料庫表中擷取;最後,調用該處理常式的URL要包含一個名為id的查詢字串參數。
注意,這段代碼在使用查詢參數ID的值前嘗試對它進行類型轉換。通過驗證ID參數中是否包含資料型資料,能顯著降低受到外界攻擊的風險。
HttpResponse對象的BinaryWrite方法能夠將位元組數組寫入輸出資料流。
在web.config中註冊
HTTP處理常式必須在web.config檔案中註冊,並綁定到一個公用端點上:
<httpHandlers>
<add verb="*" path="dbimage.axd" type="Core35.Components.dbImageHandler,Core35Lib" />
</httpHandlers>
使用
在瀏覽器中輸入類似如下的URL:http://localhost:57023/core35/dbimage.axd?id=1,該URL的含義是在資料庫中查詢員工ID為1的員工相片。
我們還可以將類似URL綁定到Web控制項上Image控制項上實現動態訪問映像。