[99,分]如何读出数据库里的image字段

bushido 2005-05-11 02:38:39
上传关键代码
protected System.Web.UI.HtmlControls.HtmlInputFile img;
protected System.Web.UI.WebControls.Button Button1;
......
Int32 len = 0; //length of the upload file
string ctype = string.Empty;//type of the upload file
string sql = string.Empty;
System.Web.HttpPostedFile pf = img.PostedFile;
len = pf.ContentLength;
ctype = pf.ContentType;
Stream stre = pf.InputStream;
byte[] streBt = new byte[len];
sql = "insert into testimagestore(imagedata,imagecontenttype,imagesize) values"+
"(@idata,@itype,@isize)";
SqlParameter pData = new SqlParameter("@idata",SqlDbType.Binary,len);
pData.Value = streBt;
SqlParameter pType = new SqlParameter("@itype",SqlDbType.VarChar,50);
pType.Value = ctype;
SqlParameter pSize = new SqlParameter("@isize",SqlDbType.BigInt);
pSize.Value = len;
XWeb.SqlServerDAL.SqlFunction.CmExecuteOpen(BaseCls.Conn(),
new SqlParameter[]{pData,pType,pSize},sql,CommandType.Text);
=====================================
showimg.aspx
图片显示关键代码
......
DataTable dt = XWeb.SqlServerDAL.SqlFunction.DSExecuteOpen(BaseCls.Conn(),
new SqlParameter[]{pid},sql,CommandType.Text).Tables[0];
if(dt.Rows.Count>0)
{
Response.Clear();
Response.ContentType = (string)dt.Rows[0]["imagecontenttype"];
Response.BinaryWrite((byte[])dt.Rows[0]["imagedata"]);
//Response.OutputStream.Write((byte[])dt.Rows[0]["imagedata"],0,int.Parse(dt.Rows[0]["imagesize"].ToString()));
Response.End();
}

为什么我打开http://showimage.aspx?id=1得不到图片显示出来,
急急急!!!
...全文
151 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
renyu732 2005-07-07
  • 打赏
  • 举报
回复
up
sykpboy 2005-07-07
  • 打赏
  • 举报
回复
還沒解決嗎?
margg 2005-07-06
  • 打赏
  • 举报
回复
margg 2005-07-06
  • 打赏
  • 举报
回复
存入数据库的图片,取出的byte长度只有16
kgdiwss 2005-07-06
  • 打赏
  • 举报
回复
不清楚你为什么会出问题,从数据库中读出来图片地址,显示,不是很简单的?
goody9807 2005-07-06
  • 打赏
  • 举报
回复
二、显示数据库中的图像数据

前文我们介绍了利用OleDb.NET将图片保存到数据库的实现方法,现在,我们同样使用OleDb.NET将来自数据库的图像数据在页面显示出来。

首先,我们来看实现数据显示的类,代码如下:

namespace UploadSample {


public class MainDisplay : System.Web.UI.Page {


public void Page_Load(System.Object sender, System.EventArgs e) {


int ImgID = System.Convert.ToInt32(Request.QueryString["ImgID"]);

System.Data.OleDb.OleDbConnection Con = new System.Data.OleDb.OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;" +

"Integrated Security=SSPI;Initial Catalog=northwind");

System.String SqlCmd = "SELECT * FROM Images WHERE ImageID = ?";

System.Data.OleDb.OleDbCommand OleDbCmdObj = new System.Data.OleDb.OleDbCommand(SqlCmd, Con);

OleDbCmdObj.Parameters.Add("@ImageID", System.Data.OleDb.OleDbType.Integer).Value = ImgID;


Con.Open();


System.Data.OleDb.OleDbDataReader OleReader = OleDbCmdObj.ExecuteReader();



OleReader.Read();


Response.ContentType = (string)OleReader["ContentType"];


Response.OutputStream.Write((byte[])OleReader["Image"], 0, (int)OleReader["ByteSize"]);


Response.End();


Con.Close();


}


}


}

在以上的代码中,我们实现使用Request.QueryString["ImgID"]取得要求显示的图片的ImgID,这个ImgID就是图片在数据库中的唯一ID,该ID是上传图像数据的时候,数据库直接生成的。

在上面代码中,我们需要注意的就是图像的生成部分,当DataReader从数据库取得图像数据以后,不能直接和其他文本数据一样显示在页面,而应该首先设置数据类型ContentType,这里,数据类型就是使用我们上传数据的时候添加的数据类型,用(string)OleReader["ContentType"]取得;然后使用Write方法将数据显示在页面;最好,使用End方法结束数据输出。

以上是图像数据显示的一个类,现在,我们来看怎样在页面中真正的实现取得数据库图像数据并且显示的功能:

<html>

<body>


<img src="displayimage.aspx?ImgID=201">

<img src=" displayimage.aspx?ImgID=202">


<body>

</html>


是不是很简单?几乎和标准HTML标记一样,只是在displayimage.aspx后面加上了图像数据的ID号。

goody9807 2005-07-06
  • 打赏
  • 举报
回复
一、图像上传至数据库

为了将图片存入数据库,我们有必要将数据库结构首先提出来,在保存图像的数据表中,我们针对图片,有一个专门的字段ImageDescription用来标明图像的相关信息,这样处理大量图像的时候就能通过这些简单的描述而区分它们;另外,ImageID字段用来作为图像唯一标示,Image字段用来存储图像信息;ContentType用来说明图像的ContentType类型;ByteSize用来保存图像的大小信息。下面是建表的SQL语句。


CREATE TABLE [dbo].[Images] (

[ImageID] [int] IDENTITY (1, 1) NOT NULL ,

[Image] [image] NULL ,

[ContentType] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,

[ImageDescription] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,

[ByteSize] [int] NULL

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


现在,我们来看数据图像上传的一个简单界面,在这里,用户选择一个图片,点击上传按钮就直接将图片保存到了数据库。


<%@ Page Inherits="UploadSample.Main" SRC="Upload.cs"%>

<HTML>

<BODY>

<FORM  ENCTYPE="multipart/form-data" RUNAT="server" ID="Form1">

<h1>

试验:<FONT COLOR="BLUE">System.Data.OleDb</FONT>

</h1>

<TABLE RUNAT="server" WIDTH="700" ALIGN="left" ID="Table1">

<TR>

<TD>

<B>图像文件:</B>

</TD>

<TD>

<INPUT TYPE="file" ID="UP_FILE" RUNAT="server" STYLE="Width:320" ACCEPT="text/*" NAME="UP_FILE">

</TD>

</TR>

<TR>

<TD>

<b>文件描述:</b>

</TD>

<TD>

<asp:TextBox RUNAT="server" WIDTH="239" ID="txtDescription" MAINTAINSTATE="false" />

</TD>

</TR>

<TR>

<TD>

<asp:Label RUNAT="server" ID="txtMessage" FORECOLOR="red" MAINTAINSTATE="false" />

</TD>

<TD>

<asp:Button RUNAT="server" WIDTH="239" ONCLICK="Button_Submit" TEXT="上传" />

</TD>

</TR>

</TABLE>

</FORM>

</BODY>

</HTML>


在以上的代码中,我们需要注意,在页面表单部分,注意加入:ENCTYPE="multipart/form-data",这与一般的表单不同;另外,以下代码用来实现选择文件的输入框:<INPUT TYPE="file" ID="UP_FILE" RUNAT="server" STYLE="Width:320" ACCEPT="text/*" NAME="UP_FILE">。

hchxxzx 2005-07-06
  • 打赏
  • 举报
回复
以上的方法我用过了呀,可是访问http://showimage.aspx?id=1,还是出现红色的X
------
这可能是因为IE缓存的问题.你可在上述链接上,添加一个变化的量,让它不读取缓存.
http://showimage.aspx?id=1&tmp=xxx
后面的tmp,你可使用比如说时间(日时分秒),这样浏览的时候,条件发生了变化,浏览器就不会去读取缓存的数据.
bushido 2005-05-11
  • 打赏
  • 举报
回复
狂晕,以上的方法我用过了呀,可是访问http://showimage.aspx?id=1,还是出现红色的X

不知道怎么办了,我用的.net frame 是1.1.4322
vzxq 2005-05-11
  • 打赏
  • 举报
回复
try
{
myConnection.Open();
SqlDataReader myDataReader;
myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
if(myDataReader.Read())
{
Response.Clear();

Response.ContentType = myDataReader["PersonImageType"].ToString();
Response.BinaryWrite((byte[])myDataReader["PersonImage"]);
}
myConnection.Close();
}
catch (SqlException SQLexc)
{
}
Response.End();
}
hchxxzx 2005-05-11
  • 打赏
  • 举报
回复
以下是ORACLE数据库中BLOB字段中的图片取出显示程序,你参照一下,我想大体是类似的.

在页面中,放一个Image控件,在后台指定它的链接地址如下:
----------------------------------------------------------------------
//为方便,写一个固定ID号tmp_id=103
this.Image1.ImageUrl = "showimg.aspx?tmp_id=103" ;


下面是显示图片的页面showimg.aspx后台代码,该页面不需要放任何东西.
--------------------------------------------------------------------
//创建数据库连接
OracleConnection myConnection = new OracleConnection(ConfigurationSettings.AppSettings["sysDSN"]);
myConnection.Open();

//打开数据库
OracleCommand myCommand = myConnection.CreateCommand();
string sql = "select tmp_blob from tmp where tmp_id = 103";
myCommand.CommandText = sql;
OracleDataReader myRead = myCommand.ExecuteReader();

//开始读取
myRead.Read();
//这个方法更直接
Byte[] Buffer = (Byte[])myRead[0];
//OracleLob myLob = myRead.GetOracleLob(0);
//长度是long,转为int32
//int myLength = Convert.ToInt32(myLob.Length);  
//Byte[] Buffer = new byte[myLength];      
//myLob.Read(Buffer,0,myLength);

//输出
this.Response.Clear();
//输出mime类型,根据上传的文件取到的mimetype,是什么我忘记了,自己写上,不过不写也没有关系.
this.Response.ContentType = "";
this.Response.BinaryWrite(Buffer);
this.Response.End();
bushido 2005-05-11
  • 打赏
  • 举报
回复
用到了
if(Request.QueryString["id"]!=null)
id = int.Parse(Request.QueryString["id"]);
SqlParameter pid = new SqlParameter("@id",SqlDbType.Int);
pid.Value = id;
sykpboy 2005-05-11
  • 打赏
  • 举报
回复
showimage裏面你有用到id嗎?

62,075

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧