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

ASP.NET 圖片存入資料庫與讀取顯示:Byte[]、Image、MemoryStream 三種轉換方式完整指南

     編輯:ASP.NET 基礎

存入資料庫:三種取得 Byte[] 的方式

1. FileUpload 直接取得

byte[] fileData = FileUpload1.FileBytes; // .NET 2.0+

2. 從實體檔案讀取

public static byte[] FileToBytes(string path)
{
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    using (BinaryReader br = new BinaryReader(fs))
    {
        return br.ReadBytes((int)fs.Length);
    }
}

3. Image 物件轉 Byte[] (含壓縮/格式轉換)

public static byte[] ImageToBytes(Image img, ImageFormat format = null)
{
    using (MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, format ?? ImageFormat.Jpeg);
        return ms.ToArray();
    }
}

資料表結構建議

CREATE TABLE Images (
    Id INT PRIMARY KEY IDENTITY,
    FileName NVARCHAR(255),
    ContentType NVARCHAR(100),
    ImageData VARBINARY(MAX),  -- SQL Server
    -- BLOB / BYTEA (PostgreSQL) / LONGBLOB (MySQL)
    CreatedAt DATETIME DEFAULT GETDATE()
);

讀取並顯示:兩種模式

模式一:專用 .ashx 處理常式輸出圖片流 (推薦)

// ImageHandler.ashx
public class ImageHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext ctx)
    {
        string id = ctx.Request.QueryString["id"];
        if (string.IsNullOrEmpty(id)) return;

        byte[] data = GetImageFromDb(id); // 自行實作查詢
        if (data == null || data.Length == 0) return;

        ctx.Response.Clear();
        ctx.Response.ContentType = "image/jpeg"; // 或依資料庫存的 ContentType
        ctx.Response.BinaryWrite(data);
        ctx.Response.End();
    }
    public bool IsReusable => false;
}

前端使用:<img src="ImageHandler.ashx?id=123" />

模式二:頁面 Page_Load 直接輸出 (較不彈性)

protected void Page_Load(object sender, EventArgs e)
{
    byte[] imgData = GetImageFromDb(Request.QueryString["id"]);
    if (imgData != null && imgData.Length > 0)
    {
        Response.Clear();
        Response.ContentType = "image/gif";
        Response.OutputStream.Write(imgData, 0, imgData.Length);
        Response.End();
    }
}

Oracle BLOB 讀取範例

private Image GetImageFromOracle()
{
    using (OracleConnection conn = new OracleConnection(connStr))
    using (OracleCommand cmd = new OracleCommand("SELECT IMGDATA FROM T_IMG WHERE IMGID=100", conn))
    {
        conn.Open();
        byte[] data = (byte[])cmd.ExecuteScalar();
        using (MemoryStream ms = new MemoryStream(data))
            return Image.FromStream(ms);
    }
}

效能與架構建議

  1. 大圖檔建議存檔案系統/物件儲存 (OSS/S3),資料庫僅存路徑,避免資料庫膨脹、備份緩慢。
  2. 若必須存資料庫,使用 **VARBINARY(MAX) / BLOB**,並建立**獨立資料表**,避免主表掃描效能下降。
  3. 讀取端**快取** (MemoryCache/Redis) 高頻存取圖片。
  4. 輸出前**檢查 Content-Type**,避免瀏覽器誤判。
  5. 現代專案改用 **Base64 Data URL** 嵌入小圖示:src="data:image/png;base64,...",減少 HTTP 請求。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved