承接上篇文章 (儲存篇),本文實作從 SQL Server 資料庫讀取二進位圖片資料並輸出至 HTTP 回應,實現圖片動態顯示。
using System;
using System.Data.SqlClient;
using System.Web;
namespace ImageProcess
{
public class ReadImage : System.Web.UI.Page
{
private void Page_Load(object sender, EventArgs e)
{
// 1. 取得查詢字串參數
string imageId = Request.QueryString["id"];
if (string.IsNullOrEmpty(imageId)) return;
// 2. 資料庫連線 (實務應從 Web.config 讀取)
string connStr = "server=.;database=pubs;uid=sa;pwd=;";
using (SqlConnection conn = new SqlConnection(connStr))
{
string sql = "SELECT ImageContentType, ImageData FROM ImageStore WHERE ImgID = @ImgID";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@ImgID", imageId); // 參數化查詢,防 SQL Injection
try
{
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
if (reader.Read())
{
// 3. 設定回應標頭
Response.Clear();
Response.ContentType = reader["ImageContentType"].ToString(); // 如 image/jpeg
// 4. 輸出二進位資料
Response.BinaryWrite((byte[])reader["ImageData"]);
}
}
}
catch (SqlException ex)
{
Response.Write("資料讀取錯誤:" + ex.Message);
}
}
}
Response.End(); // 結束回應,避免輸出多餘 HTML
}
}
}
| 技術點 | 說明 |
|---|---|
| Response.BinaryWrite | 直接輸出位元組陣列至 HTTP 回應主體,不經文字編碼 |
| Response.ContentType | 設定 MIME 類型,瀏覽器據此決定如何渲染 (顯示圖片而非下載) |
| Response.Clear | 清除先前可能已輸出的內容 (如 WebForm 預設 HTML) |
| Response.End | 立即結束回應,防止後續頁面生命週期輸出干擾圖片資料 |
| CommandBehavior.CloseConnection | Reader 關閉時自動關閉連線,資源管理更安全 |
| 參數化查詢 | @ImgID 參數防止 SQL Injection,絕不直接拼接字串 |
在 ASPX 頁面或 HTML 中直接引用:
| 欄位名 | 型別 | 說明 |
|---|---|---|
| ImgID | int (PK) | 圖片識別碼 |
| ImageData | image / varbinary(MAX) | 二進位圖片資料 |
| ImageContentType | varchar(50) | MIME 類型 (image/jpeg, image/png...) |
| ImageDescription | varchar(200) | 描述 |
| ImageSize | bigint | 檔案大小 (bytes) |
Response.Cache.SetCacheability(HttpCacheability.Public) 與 SetMaxAge 減少資料庫存取ExecuteReaderAsync + ReadAsync 釋放執行緒ImageContentType 僅允許圖片 MIME 類型,防止惡意檔案上傳執行maxRequestLength / maxAllowedContentLength)