请教高手:
   如何在datagrid中动态绑定图片,类似论坛中的跟贴,是否用二进制流上传,然后再下载?有代码的话,能否指点一二?

解决方案 »

  1.   

    数据库里存的是图片的路径,然后在datagrid中就可以动态梆定了!如:
    <asp:image id="imgFace" runat="server" ImageUrl="<%# DataBinder.Eval(Container.DataItem,"faceimg")%>" />
      

  2.   

    楼上说的这些图片只能放在服务器上了.
       而我要求的是客户端发图片,别人可以看到,其实就是论坛中贴图片的功能.datagrid用来放这些图片
      

  3.   

    客户端上传的图片就是存到服务器上或数据库里的,然后在由关联的字段显示出来的。传到服务器上的较简单,就像一楼所说的。
    数据库中上传图片C#代码是:
    //实现照片上传
    private void imbUp_Click(object sender, System.Web.UI.ImageClickEventArgs e)
    {
    //获取文件名
    string filestr=imageFile.Value.ToString();
    string FileName=filestr.Substring(filestr.LastIndexOf("\\")+1);
    //获取对由客户端指定的上传文件的访问
    HttpPostedFile UpFile=imageFile.PostedFile;
    //获取文件类型
    string imgContentType=UpFile.ContentType;
    //建立数据流对像,获取一个 Stream 对象,该对象指向一个上载文件,以准备读取该文件的内容
    Stream FileStream=UpFile.InputStream;
    //获取上传文件的字节大小
    int FileLength=(int)UpFile.ContentLength;
    //文件存储到字节数组
    Byte []FileByte=new byte[FileLength];
    //读取图象文件数据
    FileStream.Read(FileByte,0,FileLength);
    //关闭文件流
    FileStream.Close();
    //定义ADO数据库连接
    SqlConnection strConn=new SqlConnection();
    //定义连接字符串
    strConn.ConnectionString=c_Str;
    //定义连接命令
    SqlCommand cmd=new SqlCommand();
    cmd.Connection=strConn;
    //使用存储过程
    cmd.CommandType=CommandType.StoredProcedure;
    //存储过程名
    cmd.CommandText="pro_imgup";
    //定义参数
    SqlParameter imgname=new SqlParameter();
    //图片名称
    imgname=cmd.Parameters.Add("@ImgName",SqlDbType.VarChar,50);
    //参数方向
    imgname.Direction=ParameterDirection.Input;
    //参数值
    //图片名
    imgname.Value=FileName.ToString();
                    //定义参数
    SqlParameter imgdes=new SqlParameter();
    //图片描述
    imgdes=cmd.Parameters.Add("@ImgDes",SqlDbType.VarChar,50);
    //参数方向
    imgdes.Direction=ParameterDirection.Input;
    //参数值
    imgdes.Value=txtImgDes.Text.ToString();
    //定义参数
    SqlParameter imgcla=new SqlParameter();
    //图片类型
    imgcla=cmd.Parameters.Add("@ImgCla",SqlDbType.Char,4);
    //参数方向
    imgcla.Direction=ParameterDirection.Input;
    //参数值
    imgcla.Value=imgContentType;
    //定义参数
    SqlParameter imgdate=new SqlParameter();
    //上传时间
    imgdate=cmd.Parameters.Add("@ImgDate",SqlDbType.DateTime);
    //参数方向
    imgdate.Direction=ParameterDirection.Input;
    //时间为当前时间
    imgdate.Value=System.DateTime.Now;
    //定义参数
    SqlParameter imgimg=new SqlParameter();
    //图片
    imgimg=cmd.Parameters.Add("@ImgImg",SqlDbType.Image);
    //参数方向
    imgimg.Direction=ParameterDirection.Input;
    //图片值为传上来得图片文件流
    imgimg.Value=FileByte;
    //定义参数
    SqlParameter dirid=new SqlParameter();
    //图片所属文件夹目录
    dirid=cmd.Parameters.Add("@DirId",SqlDbType.BigInt);
    //参数方向
    dirid.Direction=ParameterDirection.Input;
    //参数值为页面传值,文件夹编号
    dirid.Value=Request.QueryString["DirId"].ToString();
    //打开数据连接
                    strConn.Open();
    int odr=cmd.ExecuteNonQuery();
    if(odr>0)
    {
    txtImgDes.Text="";
    ImageShow();
    }
    else
    Response.Write("<script>alert('图片上传失败!')</script>");
    //关闭数据连接
    strConn.Close();
    }
    数据库中读取图片C#代码就是(用一个新的页面读取,DataGrid的绑定就由Img控件绑定这个页面,传一个图片ID就好了):
    public class imageshow : System.Web.UI.Page
    {
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(Session["usrName"]==null)
    Response.Redirect("/login.aspx");
    else
    {
    if(!Page.IsPostBack)
    {
    string imageid=Request.QueryString["Img_Id"].ToString();
    ImageShow(imageid);
    }

    }
    }
    //
    private string c_Str=ConfigurationSettings.AppSettings["ConnectionString"];
    //
    private void ImageShow(string imageid)
    {
    //定义ADO数据库连接
    SqlConnection strConn=new SqlConnection();
    strConn.ConnectionString=c_Str;
    //定义连接命令
    SqlCommand cmd=new SqlCommand();
    cmd.Connection=strConn;
    //类型为SQL语句
    cmd.CommandType=CommandType.Text;
    //存储过程字符串
    cmd.CommandText="Select Img_Name,Img_Cla,Img_Img from image where Img_Id='"+imageid+"'";
    strConn.Open();
    SqlDataReader dr=cmd.ExecuteReader();
    if(dr.Read())
    {
    Response.Clear();
    //定义内存流
    MemoryStream stream = new MemoryStream();
    //定义位图
    Bitmap bm = null; 
    System.Drawing.Image image = null;
    //取得图像
    byte[] blob = (byte[])dr[2];
    //写入图像于内存流
    stream.Write(blob,0,blob.Length);
    bm = new Bitmap(stream);
    int width,height;
    if(bm.Width>800)//限制最大宽为800像素
    {
    width=800; 
    height = (int)(width*((double)bm.Height/(double)bm.Width)); 
    }
    else
    {
    width=bm.Width;
    height=bm.Height;
    }
    // GetThumbnailImage生成缩略图 
    image = bm.GetThumbnailImage(width,height,null,IntPtr.Zero); 
    //设置输出流类型
    Response.ContentType = dr[1].ToString(); 
    //输出图片
    image.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg); //加上标题
    string flName = System.Web.HttpUtility.UrlEncode(dr[0].ToString(),System.Text.Encoding.UTF8);
    Response.AddHeader("Content-Disposition","attachment;filename="+ flName +";");
    if(image!=null)
    image.Dispose(); 
    if(bm!=null) 
    bm.Dispose(); 
    stream.Close();
    Response.Flush();
    Response.End();
    }
    dr.Close();
    strConn.Close();
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load);
    }
    #endregion
    }