目前,在很多的應用中,都有碰到上傳電子照片或者圖片的情況,那麼就來看一下,在.Net中是如何?這個功能的。
//上傳電子照片,沒有儲存到資料庫,只是暫存在Session中,並在image控制項上顯示
private void btn_upload_Click(object sender, System.EventArgs e)
{
//每次上傳照片之前,先清空圖片Session["imageData"],Session["imageSize"]和Session["tempImage"]中的內容
Session["imageData"] = null;
Session["imageSize"] = null;
Session["tempImage"] = null;
HttpPostedFile upFile = this.up_file.PostedFile;
int iFileLength = upFile.ContentLength;
string imageType;
try
{
if( upFile.FileName.Equals("") )
{
imageType = "";
}
else
{
imageType = upFile.FileName.Substring( upFile.FileName.LastIndexOf('.'), upFile.FileName.Length - upFile.FileName.LastIndexOf('.') ).Trim().ToLower();
}
if(iFileLength == 0)
{
Response.Write("<script language=javascript>");
Response.Write("alert('請先選擇要上傳的檔案!');");
Response.Write("</script>");
return;
}
else if( iFileLength > 1048576)
{
Response.Write("<script language=javascript>");
Response.Write("alert('上傳檔案太大,系統限制最大為1M!');");
Response.Write("</script>");
return;
}
else if(this.tb_gh.Text == "")
{
Response.Write("<script language=javascript>");
Response.Write("alert('請先填寫工號!');");
Response.Write("</script>");
return;
}
else if( imageType != ".jpg" && imageType != ".bmp" && imageType != ".gif")
{
Response.Write("<script language=javascript>");
Response.Write("alert('圖片格式不正確,要求jpg格式的圖片!');");
Response.Write("</script>");
return;
}
else
{
this.Image1.ImageUrl = this.up_file.PostedFile.FileName;
if(this.Image1.Width.Value > 100 || this.Image1.Height.Value > 120 )
{
this.Image1.ImageUrl = "";
Response.Write("<script language=javascript>");
Response.Write("alert('上傳的照片尺寸太大!尺寸限制在100*120之內!');");
Response.Write("</script>");
return;
}
else
{
this.lb_msg.Visible = true;
this.lb_msg.Text = "電子照片上傳成功!";
byte[] FileByteArray = new byte[iFileLength];
Stream StreamObject = upFile.InputStream;
int ImgSize = upFile.ContentLength;
string ImgType = upFile.ContentType;
string ImgID = this.tb_gh.Text.Trim();
Session["tempImage"] = (HttpPostedFile)upFile;
//重新將圖片資訊賦值給Session
Session["imageData"] = (byte [])FileByteArray;
Session["imageSize"] = Convert.ToInt32(ImgSize.ToString());
}
}
}
catch(Exception ex)
{
this.lb_msg.Visible = true;
this.lb_msg.Text = ex.Message.ToString();
}
}
本例中,是把圖片以二進位byte []的形式存入資料庫;取出時,先讀取二進位流,然後再寫入一個temp.jpg檔案中進行顯示,代碼如下:
//建立一個temp.jpg檔案,若已經存在,則改寫該檔案為空白檔案
FileStream fs = new FileStream(Server.MapPath("..\\image\\temp.jpg"), FileMode.Create);
fs.Write( (byte [])read["lzb2dzzp"], 0, Convert.ToInt32(read["lzb2imageSize"]) );
this.Image1.ImageUrl = "..\\image\\temp.jpg";
fs.Close();
Session["imageData"] = (byte [])read["lzb2dzzp"];
Session["imageSize"] = Convert.ToInt32( read["lzb2imageSize"] );
也可以選擇將圖片存入檔案目錄中,在讀取和儲存效率方面,可能會更好一些。
存在的問題是:假如第一次查詢資料庫(或者目錄),選擇顯示A的照片,可以正常顯示在image上;第二次,重新進行查詢,然後選擇顯示B的照片,則顯示的仍是A的照片,需要重新整理一次才可以正常顯示B的照片;該問題,自己還未能解決,可能是與緩衝有關,但並不清楚具體問題出在哪裡。若有誰可以提供一個好的解決方案,希望可以在此留言。