天天看点

ASP.NET 上传图片至数据库并读取图片显示

今天,和大家讨论一下在ASP.NET中,如何上传图片至数据库,然后再将图片读取显示的问题。欢迎高手提出自己的方法!!!

目前,我主要用到以下两种方法:

1:上传图片的相对路径到数据库中相应字段里,读取显示时,将控件(假设用的是Image控件)的ImageUrl属性指向该相对路径即可。

2:将图片以二进制流的方式整体上传到数据库里,读取显示时,以二进制流的方式整体读出。这种方法稍微麻烦一点,但保存的是图片整体到数据库里。

第一种方法,实现起来比较简单,因为存入数据库里的只是图片相对路径,当然,同时也就有很大的局限性,由于是相对路径,所以当本地的图片变换了位置

或移除,或是在其他主机上浏览该图片时,就无法显示了。第二种方法,就比较灵活了,可以用在交互性的页面,比如校友录,因为上传的是整张图片,所

以只要读取正确,就能任何主机上显示出来。

下面,分别通过实际的代码,介绍这两种方法。

在这两个方法里,我将用到一个控件:FileUpload,该控件的具体用法参见百度谷歌。。。学习过程中,最好的老师就是他们俩。

1:上传图片相对路径,并读取显示。

数据库里的字段很简单,就两个

Image_ID    int    identity(1,1)     primarykey    not null

Image_Wpath    varchar(50)        null

Image_Wpath 用来保存图片的相对路径

这里注意,我需要上传的文件都放在文件夹“Image”,在后面的上传路径里就需要这个文件夹。

我在输入框里填入Image_ID的值,读取指定的图片,在图片的下面,显示出该图片的相对路径。

接下来,我们看一下具体代码实现上传和读取显示功能。

在项目里,有一个sqlHelper类,是一些常用的数据访问方法。这里就不详细讲了。

上传按钮里的事件:

protected   void  Button1_Click( object  sender, EventArgs e)

{

        string  name  =  FileUpload1.FileName;        // 获取文件名

        string  type  =  name.Substring(name.LastIndexOf( " . " )  +   1 );     // 获取文件类型

        string  ipath  =  Server.MapPath( " Image " )  +   " \\ "   +  name;     // 获取文件路径

        string  wpath  =   " Image\\ "   +  name;         // [color=red]设置文件保存相对路径(这里的路径起始就是我们存放图片的文件夹名)[/color]

        string  query1  =   " insert into Images values(' "   +  wpath  +   " ') " ;

        if  (type  ==   " jpg "   ||  type  ==   " gif "   ||  type  ==   " bmp "   ||  type  ==   " png " )

       {

         FileUpload1.SaveAs(ipath);         // 服务器保存路径

         sqlHelper.ExecterNonQuery(query1);

       }

}

显示按钮事件:

protected   void  Button2_Click( object  sender, EventArgs e)

{

        string  query2  =   " select * from Images where Image_ID= "   +  Convert.ToInt32(TextBox1.Text);

       SqlDataReader sdr  =  sqlHelper.GetReader(query2);

        string  wpath2  =   "" ;

        while  (sdr.Read())

       {

         wpath2  =  sdr[ 1 ].ToString();     // 获得相对路径

       }

       sdr.Close();

       Image1.ImageUrl  =  wpath2;     // 图片显示路径就是相对路径

        Label1.Text  =  wpath2;     // 显示相对路径

}

2:以二进制流的方式存入数据库,并读取显示。

数据库的字段同样简单:

Image_ID    int    identity(1,1)     primarykey    not null

Image_Content     image null

Image_Content以二进制形式保存图片

整体看一下例子里的页面组成:

上传图片页面和第一种方法一样,同样是用到FileUpload,以及一个Button,具体代码如下:

protected   void  Button1_Click( object  sender, EventArgs e)

{

        string  name  =  FileUpload1.PostedFile.FileName;

        string  type  =  name.Substring(name.LastIndexOf( " . " )  +   1 ); 

       FileStream fs  =  File.OpenRead(name);

        byte [] content  =   new   byte [fs.Length];

       fs.Read(content,  0 , content.Length);

       fs.Close();

       SqlConnection conn  =   new  SqlConnection( " Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Pooling=False;Password= " );

       SqlCommand cmd  =  conn.CreateCommand();

       conn.Open();

       cmd.CommandText  =   " insert into Images(Image_Content) values (@content) " ;

       cmd.CommandType  =  CommandType.Text;

        if  (type  ==   " jpg "   ||  type  ==   " gif "   ||  type  ==   " bmp "   ||  type  ==   " png " )

       {

         SqlParameter para  =  cmd.Parameters.Add( " @content " , SqlDbType.Image);

         para.Value  =  content;

         cmd.ExecuteNonQuery();

       }

}

显示一张图片和显示一组图片有所不同,将会分别说明之。

显示一张图片,要用到Default.aspx和Default2.aspx。Default.aspx中有一个控件Image,它的属性ImageUrl指向Default2.aspx用于显示图片。Default2.aspx用于

读取图片。

Default.aspx.cs

protected   void  Page_Load( object  sender, EventArgs e)

{

       Image1.ImageUrl  =   " Default2.aspx " ;

}

Default2.aspx.cs        

string  imgid  =  Request.QueryString[ " imgid " ];

       SqlConnection conn1  =   new  SqlConnection( " Data Source=;Initial Catalog=;Persist Security Info=True;User ID=sa;Pooling=False;Password= " );

       SqlCommand cmd1  =   new  SqlCommand( " select Image_Content from Images where Image_ID=3 " , conn1);      // 固定显示Image_ID为3的图片

       conn1.Open();

       SqlDataReader sdr  =  cmd1.ExecuteReader();

        if  (sdr.Read())

       {

         Response.BinaryWrite(( byte [])sdr[ " Image_Content " ]);

       }

       Response.End();

显示一组图片时,用ashx Handle存放图片。同时用GridView以列显示图片。Image控件绑定Image_ID。

allimage.aspx

<% @ Page Language = " C# "  AutoEventWireup = " true "  CodeFile = " allimage.aspx.cs "  Inherits = " allimage "   %>

<! DOCTYPE html PUBLIC  " -//W3C//DTD XHTML 1.0 Transitional//EN "   " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >

< HTML xmlns = " http://www.w3.org/1999/xhtml " >  

< HEAD runat = " server " >  

< title > BindImg </ title >  

</ HEAD >  

< body >  

< form id = " Form1 "  method = " post "  runat = " server " >  

< FONT face = " 宋体 " >  

< asp:DataGrid id = " MyDataGrid "  runat = " server "  AutoGenerateColumns = " False "  Width = " 632px " >  

< AlternatingItemStyle BackColor = " Beige " ></ AlternatingItemStyle >  

< HeaderStyle HorizontalAlign = " Center " ></ HeaderStyle >  

< Columns >  

< asp:TemplateColumn HeaderText = " Photo " >  

< ItemTemplate >   < asp:Image ID = " Image1 "  runat = " server "  Height = " 70px "  ImageUrl = ' <%# "Getimg.ashx?id="+Eval("Image_ID") %> '

       Width = " 100px "   />

</ ItemTemplate >  

</ asp:TemplateColumn >  

</ Columns >  

</ asp:DataGrid ></ FONT >  

< asp:SqlDataSource ID = " SqlDataSource1 "  runat = " server "  ConnectionString = " <%$ ConnectionStrings:PracticeConnectionString %> "

       SelectCommand = " SELECT * FROM [Images] " ></ asp:SqlDataSource >

</ form >  

</ body >  

</ HTML >

allimage.aspx.cs

protected   void  Page_Load( object  sender, EventArgs e)

{

       MyDataGrid.DataSource  =  SqlDataSource1;

       MyDataGrid.DataBind();

}

Getimg.ashx 

<% @ WebHandler Language = " C# "  Class = " Getimg "   %>

using  System;

using  System.Web;

using  System.Data;

using  System.Data.SqlClient;

using  System.Configuration;

public   class  Getimg : IHttpHandler {

public   void  ProcessRequest (HttpContext context)

{

        int  id  =   int .Parse(context.Request.QueryString[ " id " ]);

       SqlConnection conn  =   new  SqlConnection( @" server=;database=;uid=;pwd= " );

       SqlCommand cmd  =   new  SqlCommand( " select Image_Content from Images where Image_ID=' "   +  id  +   " ' " , conn);

       cmd.Parameters.Add( " @id " , SqlDbType.Int).Value  =  id;

       conn.Open();

       SqlDataReader dr  =  cmd.ExecuteReader();

        if  (dr.Read())

       {

         context.Response.BinaryWrite(( byte [])dr[ " Image_Content " ]); 

       }

       dr.Close();

}

public   bool  IsReusable {

        get  {

          return   false ;

       }

}

}

总结:

两种图片上传及读取显示方法,各有优点,个人更倾向于用第二种。因为第二种方法达到了真正的将图片上传到数据库。在某些项目中,我们也可能要用到第一种方法。本例中,没有严格的判断图片上传的格式,学习的朋友可以自己做严格判断,防止上传的是有害文件。如果您也好的上传图片及显示图片的方法,不妨跟帖讨论,谢谢。

转载于:https://www.cnblogs.com/zzjder/archive/2009/07/04/1517004.html