在ASP.NET程序中存储和调用word文件 http://blog.csdn.net/bcdliang/archive/2005/05/12/373886.aspx

转载 2007年09月19日 14:43:00
(1) 建立数据库
首先,我们在数据库中建立一个表,表中有三个字段,fileName(varchar,50),postTime(datetime,8), fileContent(image,16),分别存储文件名称,上传时间和word文件的具体内容,其中fileName为主键。具体的SQL脚本如下:
CREATE TABLE [dbo].[word] (
       [fileName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
       [postTime] [datetime] NOT NULL ,
       [fileContent] [image] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


(2) 上传并存储word文件
在VS.NET中建立一个ASP.NET web应用程序,在界面内加入如下控件
控件类型
ID
Text
说明
Label
Label1
请输入文档的标题

 
Label
Label2
请选择具体文档

 
File Field
File1

 
上传控件(要将此HTML控件转化为服务器控件)
TextBox
name_TextBox

 
用于录入文档标题
Button
Btn_OK
上传文件

 
Button
Btn_get
读取文件

 
HyperLink
HyperLink1
打开
用于打开word文档

上传文件时首先通过上传控件找到所需上传的文件,然后获取文件的大小,最后以流的形式写入数据库,具体代码为:

private void Btn_OK_Click(object sender, System.EventArgs e)

         {

              string name=name_TextBox.Text;

            //接收上传文件

             Stream fileStream=File1.PostedFile.InputStream; 

              //获取上传文件字节的大小

              int length=File1.PostedFile.ContentLength; 

              byte[] wordData=new byte[length];

              //从流中读取字节并写入wordData

              int n=fileStream.Read(wordData,0,length);

              //获取当前时间

              DateTime time=DateTime.Now;

              //连接数据库

              SqlConnection conn=new SqlConnection();

              conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test";

              SqlCommand cmd=new SqlCommand();

              cmd.Connection=conn;

              cmd.CommandText="INSERT INTO word (fileName,postTime,fileContent) values (@fileName,@postTime,@fileContent)";

              SqlParameter nameParam=new SqlParameter("@fileName",System.Data.SqlDbType.VarChar,50);

              nameParam.Value=name;

              cmd.Parameters.Add(nameParam);

              SqlParameter timeParam=new SqlParameter("@postTime",System.Data.SqlDbType.DateTime,8);

              timeParam.Value=time;

              cmd.Parameters.Add(timeParam);

//添加word文件

              SqlParameter contentParam=new SqlParameter("@fileContent",System.Data.SqlDbType.Image); //见本段最后注解

              contentParam.Value=wordData;

              cmd.Parameters.Add(contentParam);

              conn.Open();

              cmd.ExecuteNonQuery();

              conn.Close();

         }

:此处由于是Image类型文件,事先可能无法预测文件的大小,因此可不必指定size参数。如果希望控制上传文件的大小则可以输入size参数。如指定1000,则上传时最大可以上传1k的word文档。



3) 从数据库中读取数据并恢复为word文件

读取数据时先将数据从数据库中读入缓冲区,然后再从缓冲区写入最终文件。因此首先要开辟一个缓冲区并设定它的大小,每当缓冲区读满时就要将缓冲区内的数据写入文件,以清空缓冲区并继续向缓冲区读数据,直到最后一次将缓冲区内剩余的数据全部写入文件,新的word文档即可生成。
由于这一部分用到了字节流的输入输出操作,因此要引用System.IO命名空间
下面是关于这一部分的完整代码:

private void Btn_get_Click(object sender, System.EventArgs e)

{

//连接数据库

              SqlConnection conn=new SqlConnection();

              conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test";

              SqlCommand cmd=new SqlCommand();

              cmd.Connection=conn;

            //根据TextBox中指定的文件名进行查找读取

              cmd.CommandText="select fileContent from word where fileName='"+name_TextBox.Text.ToString()+"'";

              FileStream fs;

              BinaryWriter bw;

              //设定允许读取到缓冲区的最大长度

              int buffersize=100;

              //要将字节流读入的缓冲区

              byte[] outbyte=new byte[buffersize];

              //用于记录已经读取的字节数

              long reval;

              //字段中的索引,从这里开始读取操作

              long startIndex;

              //FileStream对象将封装的文件的相对路径或绝对路径

              string filePath=@"C:/wordData.doc";

              conn.Open();

              SqlDataReader reader;

              reader=cmd.ExecuteReader();

              while (reader.Read())

              {

                   fs=new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write);

                   bw=new BinaryWriter(fs); 

                   startIndex=0;

                   //将字节流读入outbyte缓冲区中并返回读取的字节数

                   reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize);

                   //当读取的字节流达到缓冲区允许的最大长度时要卸载缓冲区内的数据并将数据写入文件

                   while (reval==buffersize)

                   {

                       bw.Write(outbyte);

                       bw.Flush();

                       //重新设定开始读取的位置,并继续读取和写数据

                       startIndex+=buffersize;

                       reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize);

                   }

                   //将缓冲区内最后剩余的数据写入文件

                   bw.Write(outbyte,0,(int)reval-1);

                   bw.Flush();

                   bw.Close();

                  fs.Close();

              }

              reader.Close();

           conn.Close();

}

此时将按照filePath中指定的路径和名称重新生成word文档。可以在filePath中根据具体情况指定生成的word文档的名称和路径。



4) 打开word文档

 在打开word文档这一部分暂时并没有找到通过Button按钮直接打开word的有效办法,但我们可以HyperLink控件,只要将HyperLink控件的NavigateUrl属性指向word文档的物理路径就可以了。
 



3) 从数据库中读取数据并恢复为word文件

读取数据时先将数据从数据库中读入缓冲区,然后再从缓冲区写入最终文件。因此首先要开辟一个缓冲区并设定它的大小,每当缓冲区读满时就要将缓冲区内的数据写入文件,以清空缓冲区并继续向缓冲区读数据,直到最后一次将缓冲区内剩余的数据全部写入文件,新的word文档即可生成。
由于这一部分用到了字节流的输入输出操作,因此要引用System.IO命名空间
下面是关于这一部分的完整代码:

private void Btn_get_Click(object sender, System.EventArgs e)

{

//连接数据库

              SqlConnection conn=new SqlConnection();

              conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test";

              SqlCommand cmd=new SqlCommand();

              cmd.Connection=conn;

            //根据TextBox中指定的文件名进行查找读取

              cmd.CommandText="select fileContent from word where fileName='"+name_TextBox.Text.ToString()+"'";

              FileStream fs;

              BinaryWriter bw;

              //设定允许读取到缓冲区的最大长度

              int buffersize=100;

              //要将字节流读入的缓冲区

              byte[] outbyte=new byte[buffersize];

              //用于记录已经读取的字节数

              long reval;

              //字段中的索引,从这里开始读取操作

              long startIndex;

              //FileStream对象将封装的文件的相对路径或绝对路径

              string filePath=@"C:/wordData.doc";

              conn.Open();

              SqlDataReader reader;

              reader=cmd.ExecuteReader();

              while (reader.Read())

              {

                   fs=new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write);

                   bw=new BinaryWriter(fs); 

                   startIndex=0;

                   //将字节流读入outbyte缓冲区中并返回读取的字节数

                   reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize);

                   //当读取的字节流达到缓冲区允许的最大长度时要卸载缓冲区内的数据并将数据写入文件

                   while (reval==buffersize)

                   {

                       bw.Write(outbyte);

                       bw.Flush();

                       //重新设定开始读取的位置,并继续读取和写数据

                       startIndex+=buffersize;

                       reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize);

                   }

                   //将缓冲区内最后剩余的数据写入文件

                   bw.Write(outbyte,0,(int)reval-1);

                   bw.Flush();

                   bw.Close();

                  fs.Close();

              }

              reader.Close();

           conn.Close();

}

此时将按照filePath中指定的路径和名称重新生成word文档。可以在filePath中根据具体情况指定生成的word文档的名称和路径。



4) 打开word文档

 在打开word文档这一部分暂时并没有找到通过Button按钮直接打开word的有效办法,但我们可以HyperLink控件,只要将HyperLink控件的NavigateUrl属性指向word文档的物理路径就可以了。
 

 

 

 

相关文章推荐

http://blog.csdn.net/sunjd2001/archive/2007/05/15/1609263.aspx

http://blog.csdn.net/sunjd2001/archive/2007/05/15/1609263.aspx

Oracle体系结构 转自: http://blog.csdn.net/truexf/archive/2006/07/05/881726.aspx

第一篇 Oracle架构总览先让我们来看一张图这张就是Oracle 9i的架构全图。看上去,很繁杂。是的,是这样的。现在让我们来梳理一下:一、数据库、表空间、数据文件1.数据库数据库是数据集合。Ora...

http://blog.csdn.net/whpeace/archive/2007/05/23/1622510.aspx

COM 组件设计与应用(十)——IDispatch 接口 for VC.NET一、前言    终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用、非常...
  • fenving
  • fenving
  • 2011年04月15日 17:36
  • 353

http://blog.csdn.net/ztz0223/archive/2007/05/28/1628669.aspx

我一下讨论的都是在不用return把值进行返回的情况, 也就是说用指针的情况。 很简单就是指针和引用,引用在新版本的c里面也有包含,可以使用。 系统xp+ide用的 vc6.0: 要把一个值通过...

vs2005使用记趣(引用于http://blog.csdn.net/flyingjsj/archive/2008/08/02/2756496.aspx)

 vs2005使用记趣  1.名字空间的使用       老问题了,还是写出来,cout之类的函数不能直接使用了,要加上# include   using namespace std;加上全局名字空间...

java的内存泄露(转自:http://blog.csdn.net/elimago/archive/2007/12/18/1946380.aspx)

Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即...

http://blog.csdn.net/xiaominghimi/archive/2010/12/21/6090575.aspx

各位童鞋请你们注意:surfaceview中确实有 onDraw这个方法,但是你surfaceview不会自己去调用!!!  而我代码中的ondraw() 也好 draw() 也好,都是我自己定义的一...

JFreeChart画雷达图、带刻度雷达图、蜘蛛网、带刻度蜘蛛网(转自:http://blog.csdn.net/guoquanyou/archive/2008/12/10/3488313.aspx)

画雷达图/** * @作者:Jcuckoo * @日期:2008-12-9 * @版本:V 1.0 */public class MySpriderWebPlotTest {    public st...
  • lslxdx
  • lslxdx
  • 2011年06月02日 22:48
  • 1691
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在ASP.NET程序中存储和调用word文件 http://blog.csdn.net/bcdliang/archive/2005/05/12/373886.aspx
举报原因:
原因补充:

(最多只允许输入30个字)