原理其实很简单,就是修改一下HTTP的响应头信息就可以了。

 

因为我原来设计的时候就把附件的处理做成一个用户组件,所以修改起来也很简单,只要增加一个下载的界面及修改用户组件的内容即可。

具体步骤:

1、把原来显示附件的链接地址统一改为AttachDownload.aspx?attachid=xxxx

2、添加一个AttachDownload.aspx页面,具体的代码如下:

  


 1 private void Page_Load(object sender, System.EventArgs e)
 2         {
 3             int iAttachID = 0;
 4             try
 5             {
 6                 iAttachID = Convert.ToInt32(this.Request["ATTACHID"].ToString());
 7             }
 8             catch(Exception ex)
 9             {  
10                 Response.Write("参数传递错误!"+ex.Message);
11                 Response.End();  
12             }
13 
14             DataTable dt = EOffice.DataAccess.SystemManage.BLOB.Query_BLOB(iAttachID,"",ref this.Exc,Global.Conn);
15             
16             if(dt.Rows.Count==1)
17             {
18                 
19                 string Title = dt.Rows[0]["BLB_FILENAME"].ToString();//"中文的名称.doc";//这里是欲显示在另存为里面的文件名字,必须有后缀名
20                 string fileName = Global.AttachPath + "" + dt.Rows[0]["BLB_URL"].ToString();//"d:\test.doc";//这里是实际存在的文件路径
21                 
22                 Response.Charset = "UTF-8";
23                 Response.ContentEncoding = System.Text.Encoding.UTF8;
24                 Response.Buffer = false;
25                 Response.Clear();
26                 Response.ContentType = "APPLICATION/OCTET-STREAM;charset=UTF-8";//dt.Rows[0]["BLB_MIMETYPE"].ToString();//"APPLICATION/OCTET-STREAM";
27                 Response.AddHeader("Content-Disposition""attachment;filename=\"" + Server.UrlEncode(Title) +"\"");
28                 try
29                 {
30                     //Response.AddHeader("Content-Length", file.Length.ToString());
31                     Response.WriteFile(Server.MapPath(fileName));
32                     Response.Flush();
33                     Response.Clear();
34                     Response.End(); 
35                 }
36                 catch(Exception ex)
37                 {
38                     Response.ContentType = "text/html; charset=gb2312";
39                     Response.Write("<script>alert('下载文件错误:"+ex.Message+"');</script>");
40                 }
41 
42             }
43             else
44             {
45                 Response.Write("没有找到该附件内容!");
46                 Response.End();
47             }
48         }

 

 

需要注意的地方:

1、中文文件名最好用Server.UrlEncode进行处理一下。这样会安全一些,有一些IE客户端有把IE选项里的高级“总是以UTF-8发送URL钩上,如果没有钩上,不加这句话可能会出现乱码的情况,如果有钩上可能会正常。

2、.net发布的时候最好把bin下的dll删除掉再把新的复制上去。这次客户更新时候就是用覆盖的方式,造成没有及时更新,让我找了好久都没有找到问题所在。

posted on 2009-02-17 16:54  Dacia  阅读(3125)  评论(1编辑  收藏  举报