資料庫儲存圖片二進位流可簡化檔案管理、備份還原與權限控管。本文提供完整 ASP.NET (C#) 實作範例,涵蓋資料表設計、上傳存儲、二進位輸出三大核心環節。
CREATE TABLE ImageStore (
ID INT IDENTITY(1,1) PRIMARY KEY,
IMGTITLE NVARCHAR(50) NOT NULL, -- 圖片標題
IMGTYPE NVARCHAR(50) NOT NULL, -- MIME 類型 (image/jpeg, image/png...)
IMGDATA VARBINARY(MAX) NOT NULL -- 二進位圖片資料 (SQL 2005+ 建議用 VARBINARY(MAX) 取代 IMAGE)
);
<form id="frmUpload" method="post" enctype="multipart/form-data" runat="server">
<asp:TextBox ID="txtTitle" runat="server" />
<input type="file" id="File1" runat="server" />
<asp:Button ID="btnSave" Text="上傳" OnClick="btnSave_Click" runat="server" />
</form>
enctype="multipart/form-data" 為檔案上傳必要條件。
protected void btnSave_Click(object sender, EventArgs e)
{
// 1. 讀取上傳檔案流
Stream imgStream = File1.PostedFile.InputStream;
int imgLen = File1.PostedFile.ContentLength;
string imgType = File1.PostedFile.ContentType;
string imgTitle = txtTitle.Text;
byte[] imgData = new byte[imgLen];
imgStream.Read(imgData, 0, imgLen);
// 2. 參數化寫入
string connStr = ConfigurationManager.AppSettings["connstr"];
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = new SqlCommand(
"INSERT INTO ImageStore (IMGTITLE, IMGTYPE, IMGDATA) VALUES (@Title, @Type, @Data)", conn))
{
cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50).Value = imgTitle;
cmd.Parameters.Add("@Type", SqlDbType.NVarChar, 50).Value = imgType;
cmd.Parameters.Add("@Data", SqlDbType.VarBinary, -1).Value = imgData; // -1 = MAX
conn.Open();
cmd.ExecuteNonQuery();
}
}
建立獨立頁面 ShowImage.aspx,Page_Load 直接輸出二進位流:
protected void Page_Load(object sender, EventArgs e)
{
string imgId = Request.QueryString["imgid"];
if (string.IsNullOrEmpty(imgId)) return;
string connStr = ConfigurationManager.AppSettings["connstr"];
string sql = "SELECT IMGDATA, IMGTYPE FROM ImageStore WHERE ID = @Id";
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add("@Id", SqlDbType.Int).Value = int.Parse(imgId);
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.Read())
{
Response.Clear();
Response.ContentType = dr["IMGTYPE"].ToString(); // 關鍵:設定正確 MIME
Response.BinaryWrite((byte[])dr["IMGDATA"]); // 二進位輸出
Response.End();
}
}
}
}
<img src="ShowImage.aspx?imgid=123" alt="資料庫圖片" />
FILESTREAM (SQL 2008+) 或儲存檔案路徑,避免資料庫膨脹影響備份/還原速度。Response.Cache.SetCacheability(HttpCacheability.Public) 等快取標頭,減少重複資料庫存取。