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;
}
}
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");
}
}
MySql.Data 8.0+ 或 MySqlConnector(推薦,性能更強、支持流式參數)。CharSet=utf8mb4;SslMode=Preferred。MySqlDbType.Blob 對應 BLOB/MEDIUMBLOB/LONGBLOB,Byte[] 自動映射。using (var tx = conn.BeginTransaction())。