首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 圖片存資料庫完整實作:二進位儲存、多種讀取顯示、下載功能

     編輯:關於ASP.NET

將圖片以二進位 (`byte[]`) 存入 SQL Server `image`/`varbinary(max)` 欄位,並提供多種前端呈現方式(``、``、Generic Handler、Base64 Data URI),滿足簽名圖、會員照片、文件管理等需求。

資料表設計

CREATE TABLE StoreImage (
    id          INT IDENTITY(1,1) PRIMARY KEY,
    markname    VARCHAR(100) NOT NULL,   -- 圖片備註名稱
    markContent IMAGE        NOT NULL,   -- 二進位內容 (SQL 2005+ 建議 varbinary(max))
    markType    VARCHAR(100) NOT NULL,   -- MIME 類型 (image/jpeg, image/png...)
    markSize    INT          NOT NULL,   -- 檔案大小 (bytes)
    markLinkUrl VARCHAR(1000) NOT NULL,  -- 選填:外部連結備用
    markDate    DATETIME     NOT NULL DEFAULT GETDATE()
);

上傳存入資料庫

protected void btnUpload_Click(object sender, EventArgs e)
{
    if (!FileUpload1.HasFile) return;

    byte[] imgBytes = FileUpload1.FileBytes;
    string mime = FileUpload1.PostedFile.ContentType;
    int size = imgBytes.Length;

    using (var conn = new SqlConnection(connStr))
    using (var cmd = new SqlCommand(
        "INSERT INTO StoreImage (markname, markContent, markType, markSize) VALUES (@name, @content, @type, @size)", conn))
    {
        cmd.Parameters.AddWithValue("@name", txtMarkName.Text);
        cmd.Parameters.AddWithValue("@content", imgBytes);
        cmd.Parameters.AddWithValue("@type", mime);
        cmd.Parameters.AddWithValue("@size", size);
        conn.Open();
        cmd.ExecuteNonQuery();
    }
}

三種前端顯示方式

1. Generic Handler (`.ashx`) — 推薦

// ShowImage.ashx
public void ProcessRequest(HttpContext context)
{
    int id = int.Parse(context.Request["id"]);
    using (var conn = new SqlConnection(connStr))
    using (var cmd = new SqlCommand("SELECT markContent, markType FROM StoreImage WHERE id=@id", conn))
    {
        cmd.Parameters.AddWithValue("@id", id);
        conn.Open();
        using (var rd = cmd.ExecuteReader())
        {
            if (rd.Read())
            {
                context.Response.ContentType = rd["markType"].ToString();
                context.Response.BinaryWrite((byte[])rd["markContent"]);
            }
        }
    }
}
前端: `` 或 ``

2. Base64 Data URI — 適合小圖片、減少請求

string base64 = Convert.ToBase64String(imgBytes);
imgTag.Src = $"data:{mime};base64,{base64}";

3. 直接寫入 Response — 適用於下載

Response.Clear();
Response.ContentType = mime;
Response.AddHeader("Content-Disposition", $"attachment; filename={markname}.jpg");
Response.BinaryWrite(imgBytes);
Response.End();

效能與安全建議

  • 大檔案 (>1MB) 建議存檔案系統,資料庫僅存路徑。
  • 啟用資料庫 `FILESTREAM` (SQL 2008+) 兼顧交易性與效能。
  • 上傳端驗證 MIME、副檔名、檔案大小,防惡意上傳。
  • 讀取端加入 `ETag`/`Last-Modified` 支援瀏覽器快取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved