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类,是一些常用的数据访问方法。这里就不详细讲了。
上传按钮里的事件:

  1. protected void Button1_Click(object sender, EventArgs e)
  2. {
  3.        string name = FileUpload1.FileName;       //获取文件名
  4.        string type = name.Substring(name.LastIndexOf(".") + 1);    //获取文件类型
  5.        string ipath = Server.MapPath("Image") + "//" + name;    //获取文件路径
  6.        string wpath = "Image//" + name;        //[color=red]设置文件保存相对路径(这里的路径起始就是我们存放图片的文件夹名)[/color]
  7.        string query1 = "insert into Images values('" + wpath + "')";
  8.        if (type == "jpg" || type == "gif" || type == "bmp" || type == "png")
  9.        {
  10.          FileUpload1.SaveAs(ipath);        //服务器保存路径
  11.          sqlHelper.ExecterNonQuery(query1);
  12.        }
  13. }
复制代码

显示按钮事件:

  1. protected void Button2_Click(object sender, EventArgs e)
  2. {
  3.        string query2 = "select * from Images where Image_ID=" + Convert.ToInt32(TextBox1.Text);
  4.        SqlDataReader sdr = sqlHelper.GetReader(query2);
  5.        string wpath2 = "";
  6.        while (sdr.Read())
  7.        {
  8.          wpath2 = sdr[1].ToString();    //获得相对路径
  9.        }
  10.        sdr.Close();
  11.        Image1.ImageUrl = wpath2;    //图片显示路径就是相对路径
  12.        Label1.Text = wpath2;    //显示相对路径
  13. }
复制代码

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

数据库的字段同样简单:
Image_ID    int    identity(1,1)     primarykey    not null
Image_Content     image null
Image_Content以二进制形式保存图片

整体看一下例子里的页面组成:
上传图片页面和第一种方法一样,同样是用到FileUpload,以及一个Button,具体代码如下:

  1. protected void Button1_Click(object sender, EventArgs e)
  2. {
  3.        string name = FileUpload1.PostedFile.FileName;
  4.        string type = name.Substring(name.LastIndexOf(".") + 1);
  5.        FileStream fs = File.OpenRead(name);
  6.        byte[] content = new byte[fs.Length];
  7.        fs.Read(content, 0, content.Length);
  8.        fs.Close();
  9.        SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Pooling=False;Password=");
  10.        SqlCommand cmd = conn.CreateCommand();
  11.        conn.Open();
  12.        cmd.CommandText = "insert into Images(Image_Content) values (@content)";
  13.        cmd.CommandType = CommandType.Text;
  14.        if (type == "jpg" || type == "gif" || type == "bmp" || type == "png")
  15.        {
  16.          SqlParameter para = cmd.Parameters.Add("@content", SqlDbType.Image);
  17.          para.Value = content;
  18.          cmd.ExecuteNonQuery();
  19.        }
  20. }
复制代码

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

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

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.        Image1.ImageUrl = "Default2.aspx";
  4. }
复制代码

Default2.aspx.cs

  1.        string imgid = Request.QueryString["imgid"];
  2.        SqlConnection conn1 = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=sa;Pooling=False;Password=");
  3.        SqlCommand cmd1 = new SqlCommand("select Image_Content from Images where Image_ID=3", conn1);     //固定显示Image_ID为3的图片
  4.        conn1.Open();
  5.        SqlDataReader sdr = cmd1.ExecuteReader();
  6.        if (sdr.Read())
  7.        {
  8.          Response.BinaryWrite((byte[])sdr["Image_Content"]);
  9.        }
  10.        Response.End();
复制代码

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

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="allimage.aspx.cs" Inherits="allimage" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <HTML xmlns="http://www.w3.org/1999/xhtml">
  4. <HEAD runat="server">
  5. <title>BindImg</title>
  6. </HEAD>
  7. <body>
  8. <form id="Form1" method="post" runat="server">
  9. <FONT face="宋体">
  10. <asp:DataGrid id="MyDataGrid" runat="server" AutoGenerateColumns="False" Width="632px">
  11. <AlternatingItemStyle BackColor="Beige"></AlternatingItemStyle>
  12. <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
  13. <Columns>
  14. <asp:TemplateColumn HeaderText="Photo">
  15. <ItemTemplate> <asp:Image ID="Image1" runat="server" Height="70px" ImageUrl='<%# "Getimg.ashx?id="+Eval("Image_ID") %>'
  16.        Width="100px" />
  17. </ItemTemplate>
  18. </asp:TemplateColumn>
  19. </Columns>
  20. </asp:DataGrid></FONT>
  21. <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:PracticeConnectionString %>"
  22.        SelectCommand="SELECT * FROM [Images]"></asp:SqlDataSource>
  23. </form>
  24. </body>
  25. </HTML>
复制代码

allimage.aspx.cs

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.        MyDataGrid.DataSource = SqlDataSource1;
  4.        MyDataGrid.DataBind();
  5. }
复制代码

Getimg.ashx

  1. <%@ WebHandler Language="C#" Class="Getimg" %>
  2. using System;
  3. using System.Web;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Configuration;
  7. public class Getimg : IHttpHandler {
  8. public void ProcessRequest (HttpContext context)
  9. {
  10.        int id = int.Parse(context.Request.QueryString["id"]);
  11.        SqlConnection conn = new SqlConnection(@"server=;database=;uid=;pwd=");
  12.        SqlCommand cmd = new SqlCommand("select Image_Content from Images where Image_ID='" + id + "'", conn);
  13.        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
  14.        conn.Open();
  15.        SqlDataReader dr = cmd.ExecuteReader();
  16.        if (dr.Read())
  17.        {
  18.          context.Response.BinaryWrite((byte[])dr["Image_Content"]);
  19.        }
  20.        dr.Close();
  21. }
  22. public bool IsReusable {
  23.        get {
  24.          return false;
  25.        }
  26. }
  27. }
复制代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值