Response.BinaryWrite((byte[])dt.Rows[0]["RecordCopy"])問題,回答有分

cgsw12345 2005-01-08 01:19:55
Response.BinaryWrite((byte[])dt.Rows[0]["RecordCopy"])//RecordCopy為數據庫中的image字段
我想把它顯示在網頁上,英文的沒問題,中文的是亂嗎,如何解決?
...全文
90 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoveCherry 2005-01-08
  • 打赏
  • 举报
回复
Page.Response.BufferOutput = true;
Page.Response.ContentEncoding = Encoding.Default;
Page.Response.Charset = "GB2312";
Page.Response.ContentType = "image/jpeg";// 这里如果是图片是jpeg或jpg类型的这么写,如果是bmp的写成"image/bmp",gif的为"image/gif"

//下面是输出图片过程(这是我原来写过的一部分代码)
private void ShowImage(string id,string TableName) //ID表示图片在TableName表中的ID
{
int len = 4096;
string conn = "";//连接字符串
SqlConnection sqlconn = new SqlConnection(conn);
sqlconn.Open();
string sText="declare @id varchar(20);";
sText +="set @id='"+id+"';";
sText +="select @image=textptr(image),@datalen=datalength(image) from "+TableName+" where id=@id";

SqlCommand sqlcmd=new SqlCommand(sText,sqlconn);

SqlParameter ptrParam= sqlcmd.Parameters.Add("@image",SqlDbType.Binary,16);
ptrParam.Direction =ParameterDirection.Output;

SqlParameter datalenParam=sqlcmd.Parameters.Add("@datalen",SqlDbType.Int);
datalenParam.Direction=ParameterDirection.Output;

sqlcmd.ExecuteNonQuery();

int datalen=int.Parse(datalenParam.Value.ToString());
datalen -=3;//去除掉'0x0'
if(datalen<0)
{
Response.Write("<script>alert('文档数据不存在,请核查是否由于错误操作删除了文档数据!')</script>");
return;
}
if(datalen<len)
sText ="readtext "+TableName+".image @point @offset "+datalen;
else
sText ="readtext "+TableName+".image @point @offset "+len;

sqlcmd =new SqlCommand(sText,sqlconn);

SqlParameter ptrParam1=sqlcmd.Parameters.Add("@point",SqlDbType.Binary,16);
ptrParam1.Value =ptrParam.Value;
SqlParameter offParam=sqlcmd.Parameters.Add("@offset",SqlDbType.Int);
offParam.Value =0;
Stream outStream=Page.Response.OutputStream;
BinaryWriter bw=new BinaryWriter(outStream,Encoding.Default);

byte[] buffer=null;
if(datalen<len)
buffer =new byte[datalen];
else
buffer =new byte[len];

long retval=0;
int offset_ctr = 0;

SqlDataReader dr=sqlcmd.ExecuteReader(CommandBehavior.SequentialAccess);
try
{
dr.Read();
if(datalen<len)
retval =dr.GetBytes(0,0,buffer,0,datalen);
else
retval =dr.GetBytes(0,0,buffer,0,len);

while(retval>0)
{
if(datalen>2*len)
{
bw.Write(buffer);
bw.Flush();
offset_ctr +=len;
dr.Close();
offParam.Value =offset_ctr;
dr=sqlcmd.ExecuteReader(CommandBehavior.SequentialAccess);
dr.Read();
retval =dr.GetBytes(0,0,buffer,0,len);
datalen-=len;
}
else if(datalen >len)
{
bw.Write(buffer);
bw.Flush();
datalen -=len;
offset_ctr +=len;
buffer =new byte[datalen];
dr.Close();
sText ="readtext "+TableName+".image @point "+offset_ctr+" "+datalen;
sqlcmd=new SqlCommand(sText,sqlconn);
SqlParameter ptr=sqlcmd.Parameters.Add("@point",SqlDbType.Binary,16);
ptr.Value =ptrParam1.Value ;
dr=sqlcmd.ExecuteReader(CommandBehavior.SequentialAccess);
dr.Read();
retval =dr.GetBytes(0,0,buffer,0,datalen);
}
else
{
bw.Write(buffer);
bw.Flush();
offset_ctr +=datalen;
datalen =0;
buffer =new byte[datalen];
dr.Close();
sText ="readtext "+TableName+".image @point "+offset_ctr+" "+datalen;
sqlcmd=new SqlCommand(sText,sqlconn);
SqlParameter ptr=sqlcmd.Parameters.Add("@point",SqlDbType.Binary,16);
ptr.Value =ptrParam1.Value ;
offset_ctr +=datalen;
dr=sqlcmd.ExecuteReader(CommandBehavior.SequentialAccess);
dr.Read();
retval =dr.GetBytes(0,0,buffer,0,datalen);
}
}
Response.Flush();
bw.Close();
outStream.Close();

}
catch(Exception ex)
{
string ss=ex.Message ;
}
Response.End();
}

注:上面的代码是对我原来的代码进行更改之后给你的,你在调试一下吧
主要意思如下:
首先根据ID得到图片在数据库中的起始地址(@image)和大小(@datalen)
然后根据事先定义好的len长度,每次从数据库中取出len长度(具体判断看代码),依次发给浏览器以便输出,直到总共取出@datalen长度(我的代码中需要-3)
至于SQL语句上的你就需要看看帮助了

要说明的一点我的代码并不是按照你的要求去写的(没有把从数据库读取的图片并加载到image控件中,而是直接输出到浏览器上)这是因为我当初写这个方法的目的不只是为了输出图片而已,还可能输出例如文本文件,word文件或其它文件等(输出这样的文件只需更改代码前面的Page.Response.ContentType即可)

wj2929 2005-01-08
  • 打赏
  • 举报
回复
相关的可以参考下面帖子中的代码
http://community.csdn.net/Expert/topic/3684/3684675.xml?temp=.9678308
孟子E章 2005-01-08
  • 打赏
  • 举报
回复
一般要检查配置文件的设置方式,或者,检查
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
或者
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

不知道你保存的时候是什么编码,

62,066

社区成员

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

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

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

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