首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

ASP.NET 上傳圖片存入 MySQL BLOB:參數化命令防注入、流式寫入大文件

     編輯:MySQL 資料庫相關知識

ASP.NET (C#) 將上傳文件以參數化方式寫入 MySQL BLOB/LONGBLOB,關鍵在 MySqlParameter 類型 MySqlDbType.Blob 與 InputStream 讀取。

表結構


CREATE TABLE teacher (
  TID CHAR(32) PRIMARY KEY,
  TPHOTO LONGBLOB,
  TDELETE TINYINT DEFAULT 0
) ENGINE=InnoDB;

核心代碼


protected void Button1_Click(object sender, EventArgs e)
{
    string tid = Guid.NewGuid().ToString("N");
    using (var ms = new MemoryStream())
    {
        FileUpload1.PostedFile.InputStream.CopyTo(ms);
        byte[] pic = ms.ToArray();
        InsertPhoto(tid, pic);
    }
}

bool InsertPhoto(string tid, byte[] pic)
{
    const string sql = "INSERT INTO teacher(TID, TPHOTO, TDELETE) VALUES (?tid, ?pic, ?flg)";
    using (var conn = new MySqlConnection(connStr))
    using (var cmd = new MySqlCommand(sql, conn))
    {
        cmd.Parameters.Add("?tid", MySqlDbType.VarChar, 32).Value = tid;
        cmd.Parameters.Add("?pic", MySqlDbType.Blob).Value = pic;
        cmd.Parameters.Add("?flg", MySqlDbType.Int16).Value = 0;
        conn.Open();
        return cmd.ExecuteNonQuery() > 0;
    }
}

大文件優化(>10MB)

  • 避免 byte[] 全量入內存:用 cmd.Parameters["?pic"].Value = fileStream;(需 MySqlConnector 2.0+ 支持流式參數)。
  • 調大 max_allowed_packet(服務端與連接字符串 MaxAllowedPacket=1073741824)。
  • 考慮「文件落盤 + 數據庫存路徑」架構,僅存縮略圖入庫。

讀取顯示


public FileResult GetPhoto(string tid)
{
    using (var conn = new MySqlConnection(connStr))
    using (var cmd = new MySqlCommand("SELECT TPHOTO FROM teacher WHERE TID=?tid", conn))
    {
        cmd.Parameters.AddWithValue("?tid", tid);
        conn.Open();
        byte[] data = (byte[])cmd.ExecuteScalar();
        return File(data, "image/jpeg");
    }
}

避坑清單

  1. 驅動版本:MySql.Data 8.0+ 或 MySqlConnector(推薦,性能更強、支持流式參數)。
  2. 連接字符串:CharSet=utf8mb4;SslMode=Preferred。
  3. MySqlDbType.Blob 對應 BLOB/MEDIUMBLOB/LONGBLOB,Byte[] 自動映射。
  4. 事務:批量上傳時包裹 using (var tx = conn.BeginTransaction())。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved