C# winform DevExpress上傳圖片到數據庫【轉】
阿新 • • 發佈:2018-06-01
選擇圖片 filter 技術 filepath iss 二進制格式 img 變量 HERE
實現功能如下圖:
註明:此文使用的是DevExpress控件,winform 原生控件也是一樣使用方法。
1.點擊選擇圖片按鈕,功能為通過對話框選擇要上傳的文件,並將該文件在下面的PictureEdit中顯示出來。具體代碼如下:
private void btnChoosePic_Click(object sender, EventArgs e)
{
ShowPic(pictureEdit1);
}
/// <summary>
/// 選擇圖片
/// </summary>
/// <param name="picEdit"></param>
public static void ShowPic(PictureEdit picEdit)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"C:\";
ofd.Filter = "Image Files(*.JPG;*.PNG;*.jpeg;*.GIF;*.BMP)|*.JPG;*.PNG;*.GIF;*.BMP;*.jpeg|All files(*.*)|*.*";
ofd.RestoreDirectory = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
PicAddress = ofd.FileName;
Image imge = Image.FromFile(PicAddress);
Bitmap bm = new Bitmap(imge, picEdit.Width, picEdit.Height);
picEdit.Image = bm;
}
}
ShowPic()方法為靜態方法,可以直接調用,其中的PicAddress變量為靜態全局變量,用於記錄要上傳文件的文件地址。PictureEdit顯示圖片的方式,是通過PictureEdit的image屬性設定的,將圖片轉成Bitmap格式,位圖文件是最簡單的圖片格式。
2.上傳圖片,該按鈕的功能是將選定的圖片上傳到數據庫中,具體的實現代碼如下:
/// <summary>
/// 上傳圖片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUploadPic_Click(object sender, EventArgs e)
{
if (PicAddress != null)
{
if (PicType.Equals("教師"))
{
var sqlSearch =
$@"select count(*) from studentmanager.picture where PicTypeId = ‘{TeacherId}‘
and PicType=‘{PicType}‘";
var dsSearch = _db.GetResult(sqlSearch);
if (dsSearch.Tables[0].Rows[0][0].ToString().Equals("0")) //沒有重復的,則進行新增插入操作
{
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.SavePictureToDB(pic, PicAddress, PicType, TeacherId);
if (result > 0)
{
CommonFunction.MessageShow("頭像添加成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("頭像添加失敗");
}
}
else
{
//更新頭像
if (PicAddress.Equals(String.Empty))
{
CommonFunction.MessageShow("沒有重新選擇圖片進行更新");
return;
}
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.UpdatePictureToDb(pic, PicAddress, PicType, TeacherId);
if (result > 0)
{
CommonFunction.MessageShow("頭像更新成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("頭像更新失敗");
}
}
}
else if(PicType.Equals("學生"))
{
var sqlSearch =
$@"select count(*) from studentmanager.picture where PicTypeId = ‘{StudentId}‘
and PicType=‘{PicType}‘";
var dsSearch = _db.GetResult(sqlSearch);
if (dsSearch.Tables[0].Rows[0][0].ToString().Equals("0")) //沒有重復的,則進行新增插入操作
{
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.SavePictureToDB(pic, PicAddress, PicType, StudentId);
if (result > 0)
{
CommonFunction.MessageShow("頭像添加成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("頭像添加失敗");
}
}
else
{
//更新頭像
if (PicAddress.Equals(String.Empty))
{
CommonFunction.MessageShow("沒有重新選擇圖片進行更新");
return;
}
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.UpdatePictureToDb(pic, PicAddress, PicType, StudentId);
if (result > 0)
{
CommonFunction.MessageShow("頭像更新成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("頭像更新失敗");
}
}
}
}
else
{
CommonFunction.MessageShow("請先選擇圖片!", "提示", "OK", "Error");
}
}
上傳的過程大概就是:根據文件地址將對應文件轉換成數據流二進制格式–>編寫對應的SQL語句–>執行該SQL語句,將圖片添加到數據庫中。
上面代碼中SavePictureToDB方法代碼如下:
/// <summary>
/// 保存圖片到數據庫
/// </summary>
/// <param name="imageByte"></param>
/// <param name="Tablename"></param>
/// <param name="FieldPicturename"></param>
/// <param name="FieldIdxname"></param>
/// <param name="FieldIdxvalue"></param>
/// <returns></returns>
public int SavePictureToDB(byte[] imageByte,
string Picturename,
string PicType,
int PicTypeId)
{
var result = 0;
try
{
if (imageByte != null && imageByte.Length != 0)
{
using (var conn = new MySqlConnection())
{
conn.ConnectionString = ConnectionString;
conn.Open();
var insertStr = @"INSERT INTO studentmanager.picture
(
Picturename,
PicType,
PicTypeId,
imageByte
)
VALUES
(
@Picturename,
@PicType,
@PicTypeId,
@imageByte
);";
var comm = new MySqlCommand();
comm.Connection = conn;
comm.CommandText = insertStr;
comm.CommandType = CommandType.Text;
//設置數據庫字段類型MediumBlob的值為圖片字節數組imageByte
comm.Parameters.Add(new MySqlParameter("@imageByte", MySqlDbType.MediumBlob)).Value = imageByte;
comm.Parameters.Add(new MySqlParameter("@Picturename", MySqlDbType.VarChar)).Value = Picturename;
comm.Parameters.Add(new MySqlParameter("@PicType", MySqlDbType.VarChar)).Value = PicType;
comm.Parameters.Add(new MySqlParameter("@PicTypeId", MySqlDbType.Int32)).Value = PicTypeId;
//execute sql
result = comm.ExecuteNonQuery();
comm.Dispose();
conn.Close();
conn.Dispose();
}
}
}
catch (Exception)
{
// throw ex;
}
return result;
}
3.加載圖片顯示到PictureEdit;
/// <summary>
/// 窗口加載
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void HeadManager_Load(object sender, EventArgs e)
{
LoadImage(PicType, PicType.Equals("教師") ? TeacherId : StudentId);
}
/// <summary>
/// 獲取圖片
/// </summary>
/// <param name="picType"></param>
/// <param name="picTypeid"></param>
private void LoadImage(string picType, int picTypeid)
{
try
{
var imageBytes = _db.GetImage(picType, picTypeid);
var image = CommonFunction.GetImageByBytes(imageBytes);
Bitmap bm = new Bitmap(image, pictureEdit1.Width, pictureEdit1.Height);
pictureEdit1.Image = bm;
}
catch (Exception)
{
pictureEdit1.Image = Resource.DefaultUser;
}
}
4.用到的公共方法:
/// <summary>
/// 轉換為Byte[]
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public static byte[] GetContent(string filepath)//將指定路徑下的文件轉換成二進制代碼,用於傳輸到數據庫
{
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
byte[] byData = new byte[fs.Length];//新建用於保存文件流的字節數組
fs.Read(byData, 0, byData.Length);//讀取文件流
fs.Close();
return byData;
}
/// <summary>
/// 讀取byte[]並轉化為圖片
/// </summary>
/// <param name="bytes">byte[]</param>
/// <returns>Image</returns>
public static Image GetImageByBytes(byte[] bytes)
{
Image photo;
using (MemoryStream ms = new MemoryStream(bytes))
{
ms.Write(bytes, 0, bytes.Length);
photo = Image.FromStream(ms, true);
ms.Dispose();
ms.Close();
}
return photo;
}
C# winform DevExpress上傳圖片到數據庫【轉】