如何打开数据库中流文件

honkerhero 2007-10-21 11:39:29
现在的问题是,当我把一个文件选中后,该文件会以一个二进制流的方式写进数据库表的一个字段中(SQL2005),在显示的时候,我会用一个TREELIST来显示这些文件,当用户双击该文件名时,我要从数据库中读取流,然后以相应的程序打开,文件类型不确定。
例:用户选中第一个文件,aaa.doc,上传到数据库,每二个文件bbb.xls,第三个文件ccc.pdf,则在显示的时候如下:
aaa.doc
bbb.xls
ccc.pdf
当用户双击其中一个时,以流的文件从数据库中读出来,再以相应的程序打开
例,aaa.doc以WORD文件打开,bbb.xls以EXCEL文件打开,ccc.pdf以用户机器上所安装的能读取PDF文件的程序打开

解决方案
1、不用存临时文件的优先考虑,因为临时文件的删除时间不确定
2、使用临时文件和system.dia...process.start()的就不用说了,有其它更好的办法请留言
3、我这是C/S程序,B/S类的解决方案只作为参考,对解决问题帮助不大者不另外赠分

各位有什么好意见啊。帮助解决问题者,别赠分100,如果解决方案太棒,可赠200
...全文
889 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
honkerhero 2007-10-29
  • 打赏
  • 举报
回复
找到了,大家把分均分了吧,实在不是我想要的
honkerhero 2007-10-23
  • 打赏
  • 举报
回复
楼上的,我知道你所说的一切,我现在不知道的是如何处理这个流,它会自动被相应的程序打开
B/S中,IE会自动处理这些东西
fcuandy 2007-10-21
  • 打赏
  • 举报
回复
记得去年有人问过, 我搜了半天贴子在csdn上找不到了.
在google找到了.



原贴被转录的地址
http://fenlei8.52csdn.net/673952


以下是部分原贴内容

使用stream读出来,再用Response.BinaryWrite即可.

数据库:
truncate table dali --清表
insert dali values(1,0x,'jpg','1') --插记录用于以后写binary数据
exec sp_textcopy '127.0.0.1','sa','xxx','test','dali','MyImage','c:\1.jpg','where ID=1','I' --将 c:\1.jpg以二进制方式写入表dali的id=1的行的myimage字段



显示代码:

SqlConnection cn=new SqlConnection("server=127.0.0.1;uid=sa;pwd=xxx;database=test");
cn.Open();
SqlCommand cmd=new SqlCommand("select myimage from dali",cn);


int bufferSize = 100;
byte[] outbyte = new byte[bufferSize];
long retval;
long startIndex = 0;


SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);

while (dr.Read())
{


startIndex = 0;
retval = dr.GetBytes(0, startIndex, outbyte, 0, bufferSize);
while (retval == bufferSize)
{

Response.BinaryWrite(outbyte);
startIndex+= bufferSize;
retval = dr.GetBytes(0, startIndex, outbyte, 0, bufferSize);
}

Response.BinaryWrite(outbyte);
}
dr.Close();
cn.Close();

我清表插图片是为了在页面上看到输出效果.
你插pdf,doc当然都可以,不过在页面输出时将生成二进制文件流,输出将会是乱码,你需要输出文件头信息,我懒得查pdf和doc在html声明中的具体写法,所以只写进了jpg的数据.因为ie是直接支持jpg的显示的.
16进制是显示给你看.计算机中以二进制存储这是常识不用我说了吧.
我查了一下.要声明输出 doc 的话,在 我给你的代码 while(dr.Read())上一行加上两句即可:

Response.ContentType="application/vnd.ms-word";
Response.AddHeader("Content-Disposition", "attachment; filename=fdsfsd.doc");

pdf的你自己查吧
fcuandy 2007-10-21
  • 打赏
  • 举报
回复
winform的一样的,只不过不需要 Response.ContentType而已.
Response.ContentType只是输出一些信息给浏览器看的, 因为发到浏览器是二进制代码,浏览器不会去分析代码里的文件头信息

而 一个文件的流数据中, 本身已包含了自己的头信息. 只需要以相应的扩展名保存即可.
比如 exe,dll的pe头, bmp文件的bmp信息等等,本身就包含在自己的流数据中.
vlysses 2007-10-21
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20021126/19/1207615.html
一定对你有帮助
honkerhero 2007-10-21
  • 打赏
  • 举报
回复
这是B/S的,我的是WINFORM程序,估计是要用到进程的

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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