varbinary(max) / image 欄位<asp:Image ImageUrl='Handler.ashx?id=...' /> 非同步載入// ReadImage.ashx.cs
public class ReadImage : IHttpHandler {
public void ProcessRequest(HttpContext context) {
string id = context.Request.QueryString["id"];
if (string.IsNullOrEmpty(id)) return;
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString)) {
SqlCommand cmd = new SqlCommand("SELECT Photo FROM Employees WHERE EmployeeID = @id", conn);
cmd.Parameters.AddWithValue("@id", id);
conn.Open();
byte[] imgBytes = cmd.ExecuteScalar() as byte[];
if (imgBytes != null) {
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(imgBytes);
}
}
}
public bool IsReusable { get { return false; } }
}
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
void Page_Load() {
if (!IsPostBack) BindGrid();
}
void BindGrid() {
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString)) {
SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, LastName, FirstName, BirthDate FROM Employees", conn);
DataTable dt = new DataTable();
da.Fill(dt);
DataGrid1.DataSource = dt;
DataGrid1.DataBind();
}
}
// 產生圖片 URL
string FormatURL(object empID) {
return "ReadImage.ashx?id=" + empID.ToString();
}
</script>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundColumn DataField="LastName" HeaderText="姓氏" />
<asp:BoundColumn DataField="FirstName" HeaderText="名字" />
<asp:BoundColumn DataField="BirthDate" HeaderText="出生日期" DataFormatString="{0:yyyy-MM-dd}" />
<asp:TemplateColumn HeaderText="照片">
<ItemTemplate>
<asp:Image runat="server" ImageUrl='<%# FormatURL(DataBinder.Eval(Container.DataItem, "EmployeeID")) %>' Width="80" Height="100" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
<connectionStrings>
<add name="ConnStr" connectionString="Server=.;Database=Northwind;Integrated Security=SSPI;" />
</connectionStrings>
Response.Cache 設定客戶端/Proxy 快取| 問題 | 原因 | 解決 |
|---|---|---|
| 圖片顯示紅叉 | Handler 路徑錯誤 / ContentType 不對 / 資料為 NULL | 瀏覽器開發者工具檢查 Network 請求回應 |
| DataGrid 分頁後圖片消失 | ViewState 未保留資料 / Handler 依賴 Session | Handler 僅依 QueryString,不依賴 Session |
| 大圖載入慢 | 無快取 / 原始檔過大 | 資料庫存儲縮圖 / Handler 加入 OutputCache |
ASP.NET Core / MVC / Razor Pages 建議改用:
File(byte[], contentType)<img src="/api/images/@Model.Id" /> 前端繫結