Tips/Tricks#2:使用Gridview绑定数据库中的图片

使用Gridview绑定数据库中的图片

注:此系列记录在我实际开发中遇到的问题和收藏一些技巧文章。

我们都知道,在Gridview中不能直接去绑定数据库中的图片,我们可以利用HttpHandler很容易的完成这个任务,在这里我记录一下这个过程。

1.上传图片存储到数据库中

在数据库中创建一个表,添加一下3个字段:

创建一个表

步骤一:在Web页面中拖一个FileUpload 控件,一个文本框用于输入名称和提交上传按钮

<asp:FileUpload ID="fuImage" runat="server" /><br />
<asp:TextBox ID="txtImageName" runat="server"/><br />
<asp:Button ID="btnUpload" runat="server" 
OnClick="btnUpload_Click" Text="Upload" />

步骤二:在Web.Config文件内配置连接字符串。

<add name="ConnectionString" connectionString="Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\Image.mdf;Integrated Security=True;
User Instance=True" providerName="System.Data.SqlClient"/>

步骤三:把下面的代码复制到上传按钮事件中。

protected void btnUpload_Click(object sender, EventArgs e)
{
    Stream imgStream = fuImage.PostedFile.InputStream;
    int imgLen = fuImage.PostedFile.ContentLength;
    string imgName = txtImageName.Text;
    byte[] imgBinaryData = new byte[imgLen];
    int n = imgStream.Read(imgBinaryData,0,imgLen);

    //use the web.config to store the connection string
    SqlConnection connection = new SqlConnection(ConfigurationManager.
    ConnectionStrings["connectionString"].ConnectionString);
    SqlCommand command = new SqlCommand(
     "INSERT INTO Image (imagename,image)
     VALUES ( @img_name, @img_data)", connection);

    SqlParameter param0 = new SqlParameter(
     "@img_name",SqlDbType.VarChar, 50);
    param0.Value = imgName;
    command.Parameters.Add(param0);

    SqlParameter param1 = new SqlParameter(
     "@img_data", SqlDbType.Image);
    param1.Value = imgBinaryData;
    command.Parameters.Add(param1);

    connection.Open();
    int numRowsAffected = command.ExecuteNonQuery();
    connection.Close();
}

2.利用HttpHandler从数据库中读取图片

创建一个名为ImageHandler.ashx的HttpHandler从数据库中读取图片,通过imageID这个参数调用其方法显示图片。像这样:ImageHandler.ashx?ImID=200

步骤四:书写ImageHandler.ashx文件代码如下:

public class ImageHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string imageid = context.Request.QueryString["ImID"];
        SqlConnection connection =
             new SqlConnection(ConfigurationManager.
            ConnectionStrings["connectionString"].ConnectionString);
        connection.Open();
        SqlCommand command = new SqlCommand(
            "select Image from Image where ImageID=" + imageid,
             connection);
        SqlDataReader dr = command.ExecuteReader();
        dr.Read();
        context.Response.BinaryWrite((Byte[])dr[0]);
        connection.Close();
        context.Response.End();
    }

    public bool IsReusable
    {
        get{return false;}
    }
}

3.绑定Gridview控件

步骤五:拖一个Gridview控件到页面上,并将其命名为gvImages。用下面代码来绑定数据。

SqlConnection connection = new SqlConnection(ConfigurationManager.
ConnectionStrings["connectionString"].ConnectionString);
SqlCommand command = new SqlCommand("SELECT imagename,ImageID
from [Image]", connection);
SqlDataAdapter ada = new SqlDataAdapter(command);       
DataTable dt = new DataTable();
ada.Fill(dt);
gvImages.DataSource = dt;
gvImages.DataBind();

步骤六:设置Gridview控件的绑定列,其HTML代码如下:

<asp:GridView Width="500px" ID="gvImages" runat="server" 
               AutoGenerateColumns="False" >
    <Columns>
        <asp:BoundField HeaderText = "Image Name" 
                         DataField="imagename" />
        <asp:TemplateField HeaderText="Image"> 
         <ItemTemplate> 
            <asp:Image ID="Image1" runat="server" 
            ImageUrl='<%# "ImageHandler.ashx?ImID="+ Eval("ImageID")
                       %>'/> 
         </ItemTemplate>
    </asp:TemplateField>
    </Columns>
</asp:GridView>

4.上传图片,并显示

显示通过!

OK!测试通过!还有其它一些显示图片的方法。但是我认为这个比较简单


作者:李永京YJingLee's Blog
出处:http://lyj.cnblogs.com
转载请注明此处,谢谢!

Tag标签: ASP.NET,Gridview
posted @ 2008-03-20 00:12 李永京 阅读(1200) 评论(20)  编辑 收藏 所属分类: ASP.NET

  回复  引用  查看    
#1楼 [楼主]2008-03-20 10:12 | 李永京      
想用LINQ重新写一下的,没有做了,重要的是一个完成问题的思路!
  回复  引用    
#2楼 2008-03-29 11:04 | xhadk [未注册用户]
未将对象引用设置到对象的实例

什么原因。
  回复  引用  查看    
#3楼 [楼主]2008-03-29 11:36 | 李永京      
@xhadk
请具体说清楚?哪个页面,哪个控件。照我这样做,没有问题的,还是你哪一步有错误了。
  回复  引用  查看    
#4楼 2008-05-27 15:05 | yigehaoren      
为什么要把图片放在数据库里面?当作文件保存不好么?
每次设置ImageUrl就可以了。
<ItemTemplate>
<asp:Image ID="Image1" runat="server"
ImageUrl=‘’/>
</ItemTemplate>



是为了便于管理图片文件么?比如说是修改,删除?
  回复  引用  查看    
#5楼 [楼主]2008-05-27 16:24 | 李永京      
@yigehaoren
呵呵,另外保存图片就简单啦,这个是图片用二进制保存在数据库表中的~~
  回复  引用    
#6楼 2008-06-26 10:00 | bjabc [未注册用户]
李大侠,你好!
我按照你的说明,在vs2008c#中写了例子,gridView中的图片显示红叉。
我想是我创建“ImageHandler.ashx”方法不对,感觉加载图片时,没有调用ImageHandler.ashx中的方法。
在vs2008c#中创建一个asp.net web应用程序,然后在项目中添加一个“一般处理程序”项,是在ImageHandler.ashx.cs中加入
public class ImageHandler : IHttpHandler 等相关代码。

我这样对吗?

谢谢

  回复  引用  查看    
#7楼 [楼主]2008-06-26 15:53 | 李永京      
@bjabc
对的啊,就是这样。你看看是否上传了图片到数据库了,数据库是否有数据(二进制数据)。如果有就是显示有点问题,没有就是上传问题。
  回复  引用    
#8楼 2008-06-27 11:09 | bjabc [未注册用户]
OK啦,非常感谢李大侠!
原因我是联接到没有数据的库上啦(注:原来使用4楼的方法, 缺点是如果文件名称不改变而图像发生改变时,显示的图像是cache中的图像)
  回复  引用  查看    
#9楼 [楼主]2008-06-27 14:20 | 李永京      
@bjabc
o(∩_∩)o...
  回复  引用  查看    
#10楼 2008-07-26 14:08 | 金金      
楼主:您好!
请问:我存储的图片的格式是.tif后缀的图片,为什么显示不出来呢?
读取JPEG格式的能显示图片?是不是不支持.tif格式呢?
  回复  引用  查看    
#11楼 [楼主]2008-07-28 23:03 | 李永京      
@金金
不支持
  回复  引用  查看    
#12楼 2008-07-31 22:41 | aito      
connectionString="Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\Image.mdf;Integrated Security=True;
User Instance=True" providerName="System.Data.SqlClient"
什么情况下用这种做法连接数据库了?很少见过这样连的!
  回复  引用  查看    
#13楼 [楼主]2008-08-09 23:08 | 李永京      
@aito
SQLEXPRESS2005数据库
  回复  引用    
#14楼 2008-08-15 02:49 | 初学者1 [未注册用户]
步骤5这一段代码放在那里?
default.aspx/default.aspx.cs?
  回复  引用  查看    
#15楼 2008-08-27 19:22 | aito      
若图片不在数据库里,数据库里只存图片的路径,能不能一样显示呢!?
  回复  引用    
#16楼 2008-08-29 16:02 | zzz_zgxj [未注册用户]
我是用vs2005,数据库(oracle)里有图片(blob字段),用你的方法图片显示的是红X,为什么?
  回复  引用  查看    
#17楼 [楼主]2008-08-30 17:57 | 李永京      
@初学者1
default.aspx.cs的load事件里就可以了。
  回复  引用  查看    
#18楼 [楼主]2008-08-30 17:57 | 李永京      
@aito
可以,把模板中的image控件src属性换下。
  回复  引用  查看    
#19楼 [楼主]2008-08-30 17:58 | 李永京      
@zzz_zgxj
连接字符串什么地方验证下。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-24 16:09 编辑过
成果网帮您增加网站收入


相关链接: