由于最近在做一个团队项目《办公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部分可以放到配置文件中,这样代码看起来比较精简,同时可以扩展下载,可以把下载的内容统一打包,以压缩包的形式下载,这样比较好,本篇暂告一个段落了,,本篇主要目的是摘录下自己的心得体会而已。。。。。