在ASP.NET程式中儲存和調用word檔案

來源:互聯網
上載者:User
asp.net|word|程式

本文通過一個執行個體概要講解如何在ASP.NET程式中配合SQL Server2000進行word檔案的儲存和調用過程(沒有使用VBA )。

(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文檔的實體路徑就可以了。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.