一直都很想做这个功能,但没有时间去整理这次客户要求一定要做,只能做了一下。
原理其实很简单,就是修改一下HTTP的响应头信息就可以了。
因为我原来设计的时候就把附件的处理做成一个用户组件,所以修改起来也很简单,只要增加一个下载的界面及修改用户组件的内容即可。
具体步骤:
1、把原来显示附件的链接地址统一改为AttachDownload.aspx?attachid=xxxx
2、添加一个AttachDownload.aspx页面,具体的代码如下:
Code
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删除掉再把新的复制上去。这次客户更新时候就是用覆盖的方式,造成没有及时更新,让我找了好久都没有找到问题所在。