首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 儲存與輸出圖片完整實作:VARBINARY(MAX)/IMAGE 欄位、檔案上傳、二進位輸出

     編輯:關於SqlServer

資料表設計


CREATE TABLE ImageStore (
    ID int IDENTITY PRIMARY KEY,
    ImgTitle varchar(50) NOT NULL,           -- 使用者友善標題
    ImgType varchar(50) NOT NULL,            -- MIME 類型: image/jpeg, image/png...
    ImgData varbinary(max) NOT NULL          -- SQL 2005+ 用 varbinary(max); 2000 用 image
);

前端上傳 (ASP.NET WebForms 範例)


protected void BtnUpload_Click(object sender, EventArgs e) { Stream fs = File1.PostedFile.InputStream; int len = File1.PostedFile.ContentLength; string type = File1.PostedFile.ContentType; string title = TextBox1.Text; byte[] img = new byte[len]; fs.Read(img, 0, len); using (var conn = new SqlConnection(connStr)) using (var cmd = new SqlCommand( "INSERT INTO ImageStore (ImgTitle, ImgType, ImgData) VALUES (@t, @tp, @d)", conn)) { cmd.Parameters.Add("@t", SqlDbType.VarChar, 50).Value = title; cmd.Parameters.Add("@tp", SqlDbType.VarChar, 50).Value = type; cmd.Parameters.Add("@d", SqlDbType.VarBinary, -1).Value = img; // -1 = max conn.Open(); cmd.ExecuteNonQuery(); } }

輸出圖片至瀏覽器 (HTTP Handler / 專用頁面)


private void Page_Load(object sender, EventArgs e)
{
    string id = Request.QueryString["imgid"];
    using (var conn = new SqlConnection(connStr))
    using (var cmd = new SqlCommand(
        "SELECT ImgData, ImgType FROM ImageStore WHERE ID = @id", conn))
    {
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = int.Parse(id);
        conn.Open();
        using (var dr = cmd.ExecuteReader())
        {
            if (dr.Read())
            {
                Response.ContentType = dr["ImgType"].ToString();
                Response.BinaryWrite((byte[])dr["ImgData"]);  // 關鍵:BinaryWrite 而非 Write
                Response.End();
            }
        }
    }
}

前端引用:<img src="ShowImage.aspx?imgid=123" />

關鍵技術點

  • 參數化命令:防注入、自動處理二進位資料
  • varbinary(max):2 GB 上限,取代舊 image 型別 (已淘汰)
  • Response.BinaryWrite:直接寫入原始位元組流,不經字元編碼
  • Content-Type:必須正確設定,瀏覽器才能正確渲染

效能與架構建議

  1. **大檔案 (>1MB) 建議存檔案系統/Blob Storage (Azure Blob, S3)**,資料庫僅存路徑
  2. 啟用 **Filestream** (SQL 2008+) 或 **FileTable** (SQL 2012+) 結合 NTFS 流存取
  3. 讀取端加入 **快取標頭** (Cache-Control: public, max-age=31536000) 減少 DB 壓力
  4. 考慮 **CDN** 分發靜態圖片

資料庫存圖片適合中小檔案、需交易一致性、權限控管嚴格的場景。大規模圖片服務請採用物件存儲 + CDN 架構,資料庫僅存中繼資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved