由於最近在做一個團隊項目《辦公OA管理系統》,我負責做公共事務,人事管理兩大模塊,今天做到一個頁面要有一個上傳和下載文件的功能,功能很簡單,就是文件的上傳和下載而已,這里只是分享一下過程,也作為自己知識的摘錄了。。。
首先貼上頁面圖片:

今天分享的只是上傳和下載這塊
![]()
這里我想實現的是在數據庫中用一個字段來存儲上傳文件的物理路徑,當載入該頁面的時候,如果數據庫沒有存儲路徑,就是用戶沒有上傳過文件,就顯示“未含文件,請上傳”,如果上傳過了就顯示“已有文件,點擊下載”,該顯示的控件是一個LinkButton,首先來看看【上傳】按鈕的事件,貼上代碼:
上傳按鈕
2 protected void btn_upLoad_Click( object sender, EventArgs e)
3 {
4 // 用於設置是否可以上傳
5 bool isUp = false;
6 // 設定可以上傳的文件的類型
7 string[] allowExtensions = new string[] { " .jpg ", " .jpeg ", " .bmp ", " .gif ", " .txt ", " .doc ", " .docx "};
8 // 如果含有文件
9 if (fileup_ContractFile.HasFile)
10 {
11 // 上傳的文件獲取擴展名
12 string extensoin = System.IO.Path.GetExtension(fileup_ContractFile.FileName);
13 // 判斷是否是可以上傳的格式
14 for ( int i = 0; i < allowExtensions.Length; i++)
15 {
16 // 找到對應后綴
17 if (extensoin == allowExtensions[i])
18 {
19 // 設為可以上傳
20 isUp = true;
21 break;
22 }
23 }
24 // 可以上傳
25 if (isUp)
26 {
27 // 取得上傳文件的物理路徑
28 string fullPath = Server.MapPath( " ~/HumanResource/Files/ ") + fileup_ContractFile.FileName;
29
30 // 將文件保存到指定的物理路徑
31 fileup_ContractFile.SaveAs(fullPath);
32
33 // web換行----<br />
34 Literal_showUpMsg.Text = " <font color='red'>上傳文件成功!</font> <br /> " + " 文件名: " + fileup_ContractFile.FileName + " <br /> " + " 文件大小: " + (fileup_ContractFile.FileContent.Length) / 1000.00 + " KB ";
35
36 // 用隱藏控件保存下路徑 便於其他地方使用
37 hf_upPath.Value = fullPath;
38 }
39 else
40 {
41 // 打印輸出
42 Literal_showUpMsg.Text = " <font color='red'>文件上傳失敗!</font> <br/> 不支持上傳該格式的文件! ";
43 }
44 }
45 else
46 {
47 // 打印輸出
48 Literal_showUpMsg.Text = " 請先選擇要上傳的文件! ";
49 }
50 }
【思路】:首先用一個數組存放可以上傳的文件的后綴,然后當用戶選擇上傳文件的時候,判斷該文件的后綴是否是允許上傳的類型,然后再上傳中,首先獲取該文件的物理路徑,然后用SaveAs()方法將文件保存到該物理路徑就可以了,其余都是一些打印輸出
下面貼上【下載按鈕】的事件,代碼:
下載事件
2 protected void lkb_downLoad_Click( object sender, EventArgs e)
3 {
4 // 獲取在隱藏控件的物理路徑
5 string fullPath = hf_upPath.Value;
6
7 // 獲取包含在路徑中的文件名
8 string fileName = fullPath.Substring(fullPath.LastIndexOf( ' \\ ')+ 1);
9
10 string extension = System.IO.Path.GetExtension(fullPath);
11
12 // 文件操作
13 FileInfo file = new FileInfo(fullPath);
14
15 // 清空緩存區的內容和HTTP頭
16 Response.Clear();
17 Response.ClearContent();
18 Response.ClearHeaders();
19
20 // 添加HTTP頭
21 Response.AddHeader( " Content-Disposition ", " attachment;filename= " +fileName);
22 Response.AddHeader( " Content-Length ", file.Length.ToString());
23 Response.AddHeader( " Content-Transfer-Encoding ", " binary ");
24
25 // 由於有多種類型文件 判斷選擇對應的ContentType
26 switch (extension)
27 {
28 case " .docx ":
29 case " .doc ":
30 Response.ContentType = " application/msword ";
31 break;
32 case " .jpg ":
33 case " .jpeg ":
34 Response.ContentType = " image/jpeg ";
35 break;
36 case " .gif ":
37 Response.ContentType = " image/gif ";
38 break;
39 case " .txt ":
40 Response.ContentType = " text/plain ";
41 break;
42 case " .bmp ":
43 Response.ContentType = " application/x-bmp ";
44 break;
45 default:
46 Response.ContentType = " application/octet-stream ";
47 break;
48 }
49
50 // 設置響應輸出content的內容的編碼
51 Response.ContentEncoding = System.Text.Encoding.GetEncoding( " gb2312 ");
52
53 // 將文件寫到輸出流
54 Response.WriteFile(file.FullName);
55
56 //向 客戶端發送當前緩沖區的輸出(內容必須大於256字節)
57 Response.Flush();
58
59 // 使Web服務器停止處理腳本並返回當前結果
60 Response.End();
61 }
語句都已經加了相應注釋,我這里的fullPath其實在一開始獲取到這個路徑時就用一個隱藏控件(HiddenField)存儲起來,方便於獲取,同樣思路是先獲取路徑,然后從路徑中截取出文件名,然后獲取該文件的后綴,因為后面要通過這個后綴來選擇合適的ContentType,然后首先把緩沖區的內容和HTTP頭都清楚,再給設置上,再將文件寫到輸出流中,然后向客戶端發送當前緩沖區的全部內容,不過這里的ContentType部分可以放到配置文件中,這樣代碼看起來比較精簡,同時可以擴展下載,可以把下載的內容統一打包,以壓縮包的形式下載,這樣比較好,本篇暫告一個段落了,,本篇主要目的是摘錄下自己的心得體會而已。。。。。
