在ASP.Net中如何实现电子照片的上传?
目前,在很多的应用中,都有碰到上传电子照片或者图片的情况,那么就来看一下,在.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的照片;该问题,自己还未能解决,可能是与缓存有关,但并不清楚具体问题出在哪里。若有谁可以提供一个好的解决方案,希望可以在此留言。