数据库存储图像及使用Image控件显示
2008-12-02 15:11
429 查看
在数据库中存取并显示到页面Image控件的功能。原来认为并不复杂,但是实际中却遇到了一些问题。
首先来看看保存图片:
图片在数据库中使用二进制方式存储,所以要把图片转化为二进制流文件在存储到数据库中,代码如下:
private void Save()
{
MyImage img = new MyImage();
img.Img = System.Drawing.Image.FromStream(this.FileUpload1.PostedFile.InputStream);
System.IO.MemoryStream ms = new MemoryStream();
img.Img.Save(ms, img.Img.RawFormat);
SqlParameter[] paras = new SqlParameter[1];
paras[0] = new SqlParameter("@img", SqlDbType.Image, 2147483647);
paras[0].Value = ms.ToArray();
sql.DBOption("Insert Into T_img (img) Values (@img)",paras);
}
再来看看读取文件:
SqlDataAdapter adapter = new SqlDataAdapter("Select * From T_img Where imgID = " + Request.QueryString["imgID"].ToString(), sql.SqlConn);
DataSet Ds = new DataSet();
adapter.Fill(Ds);
if (Ds.Tables[0].Rows.Count > 0)
{
img.ImgID = Convert.ToInt32(Ds.Tables[0].Rows[0]["imgID"]);
Byte[] bytes = (Byte[])Ds.Tables[0].Rows[0]["img"];
Response.BinaryWrite(bytes);
}
最后要将其在Image控件中显示:
在网上看了很多资料都是使用Response.BinaryWrite(bytes),但是这只能重写页面,造成页面上只显示图片,但是在实际的项目中我们有可能是要显示在某一个特定的位置,或者说在System.Web.UI.WebControls.Image控件中显示。一开始我有一个误区,想将System.Drawing.Image对象放入WebControls.Image控件中,实际上是不能直接转换的。网上很多人提出了建立一个页面只显示图像,然后把这个页面的地址传给Image1.ImageUrl。这样做显然可以成功,但是有一点我不太满意,有一个多余的页面,此时可以使用HttpHandler来解决。
在Web.config文件中加入一个HttpHandler
<system.web>
<httpHandlers>
<addverb="*"path="imgPage1.aspx"type="imgPageHandler"/>
</httpHandlers>
</system.web>
在App_Code里加入一个imgPageHandler类型,并使他继承自IHttpHandler,并重写IsReusable属性和ProcessRequest方法,代码如下:
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
MyImage img = new MyImage();
try
{
sql.DBConnect();
SqlDataAdapter adapter = new SqlDataAdapter("Select * From T_img Where imgID = " + context.Request.QueryString["imgID"].ToString(), sql.SqlConn);
DataSet Ds = new DataSet();
adapter.Fill(Ds);
if (Ds.Tables[0].Rows.Count > 0)
{
img.ImgID = Convert.ToInt32(Ds.Tables[0].Rows[0]["imgID"]);
Byte[] bytes = (Byte[])Ds.Tables[0].Rows[0]["img"];
context.Response.BinaryWrite(bytes);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
sql.DBClose();
}
}
在要显示图像的页面中将虚拟出的页面地址给Image1.ImageUrl
this.Image1.ImageUrl = "imgPage1.aspx?imgID=" + this.TextBox1.Text;
首先来看看保存图片:
图片在数据库中使用二进制方式存储,所以要把图片转化为二进制流文件在存储到数据库中,代码如下:
private void Save()
{
MyImage img = new MyImage();
img.Img = System.Drawing.Image.FromStream(this.FileUpload1.PostedFile.InputStream);
System.IO.MemoryStream ms = new MemoryStream();
img.Img.Save(ms, img.Img.RawFormat);
SqlParameter[] paras = new SqlParameter[1];
paras[0] = new SqlParameter("@img", SqlDbType.Image, 2147483647);
paras[0].Value = ms.ToArray();
sql.DBOption("Insert Into T_img (img) Values (@img)",paras);
}
再来看看读取文件:
SqlDataAdapter adapter = new SqlDataAdapter("Select * From T_img Where imgID = " + Request.QueryString["imgID"].ToString(), sql.SqlConn);
DataSet Ds = new DataSet();
adapter.Fill(Ds);
if (Ds.Tables[0].Rows.Count > 0)
{
img.ImgID = Convert.ToInt32(Ds.Tables[0].Rows[0]["imgID"]);
Byte[] bytes = (Byte[])Ds.Tables[0].Rows[0]["img"];
Response.BinaryWrite(bytes);
}
最后要将其在Image控件中显示:
在网上看了很多资料都是使用Response.BinaryWrite(bytes),但是这只能重写页面,造成页面上只显示图片,但是在实际的项目中我们有可能是要显示在某一个特定的位置,或者说在System.Web.UI.WebControls.Image控件中显示。一开始我有一个误区,想将System.Drawing.Image对象放入WebControls.Image控件中,实际上是不能直接转换的。网上很多人提出了建立一个页面只显示图像,然后把这个页面的地址传给Image1.ImageUrl。这样做显然可以成功,但是有一点我不太满意,有一个多余的页面,此时可以使用HttpHandler来解决。
在Web.config文件中加入一个HttpHandler
<system.web>
<httpHandlers>
<addverb="*"path="imgPage1.aspx"type="imgPageHandler"/>
</httpHandlers>
</system.web>
在App_Code里加入一个imgPageHandler类型,并使他继承自IHttpHandler,并重写IsReusable属性和ProcessRequest方法,代码如下:
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
MyImage img = new MyImage();
try
{
sql.DBConnect();
SqlDataAdapter adapter = new SqlDataAdapter("Select * From T_img Where imgID = " + context.Request.QueryString["imgID"].ToString(), sql.SqlConn);
DataSet Ds = new DataSet();
adapter.Fill(Ds);
if (Ds.Tables[0].Rows.Count > 0)
{
img.ImgID = Convert.ToInt32(Ds.Tables[0].Rows[0]["imgID"]);
Byte[] bytes = (Byte[])Ds.Tables[0].Rows[0]["img"];
context.Response.BinaryWrite(bytes);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
sql.DBClose();
}
}
在要显示图像的页面中将虚拟出的页面地址给Image1.ImageUrl
this.Image1.ImageUrl = "imgPage1.aspx?imgID=" + this.TextBox1.Text;
相关文章推荐
- [转]数据库存储图像及使用Image控件显示
- 数据库存储图像及使用Image控件显示
- GridView控件 Image控件 与图片的二进制数据库存储和显示
- GridView控件 Image控件 与图片的二进制数据库存储和显示
- 访问外部存储中的数据库文件,使用CursorAdapter显示在ListView组件上
- 如何将存放在数据库BLOB字段的图像显示在asp.net的IMAGE控件中
- 在jsp中直接显示从数据库中存储的图像
- GridView控件 Image控件 与图片的二进制数据库存储和显示
- VB实现图像在数据库的存储与显示
- 更改EasyUI的DataGrid的显示信息。使用formatter属性,将数据库中存储的gender为1 or 0修改为“男”or“女”。
- ImageKit使用教程:数据库中图像数据的显示和检索
- J2EE使用hibernate存储和显示BLOB图片(从页面到数据库)
- ImageKit使用教程:数据库中图像数据的显示和检索
- C#中使用FileUpload上传图片到SQL数据库中以image类型存储并使用Image控件显示注意事项
- mat文件存储struct结构,使用matlab显示图像
- ASCII Art—使用纯文本来显示图像:综述
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(四)----使用PlayerPrefs存储数据到本地
- ViewState的使用-不利用数据库就能进行存储的问题
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(七)----使用Game ID避免数据重复输入
- Winform中使用PictureBox显示及修改数据库中的照片