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

SQL Server 圖片二進位儲存與輸出完整實作 (ASP.NET)

     編輯:關於SqlServer

資料庫儲存圖片二進位流可簡化檔案管理、備份還原與權限控管。本文提供完整 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="資料庫圖片" />

最佳實踐與擴展

  • 大檔案考量:超過 1MB 圖片建議採用 FILESTREAM (SQL 2008+) 或儲存檔案路徑,避免資料庫膨脹影響備份/還原速度。
  • 快取策略:輸出端加入 Response.Cache.SetCacheability(HttpCacheability.Public) 等快取標頭,減少重複資料庫存取。
  • 安全性:驗證上傳檔案副檔名與 MIME 類型一致性,防止惡意腳本上傳。
  • 縮圖生成:上傳時同步生成縮圖儲存於同表或關聯表,提升列表頁載入速度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved