LoveCherry

技术无极限

博客园 首页 新随笔 联系 订阅 管理
  182 Posts :: 0 Stories :: 2481 Comments :: 550 Trackbacks

     有的时候为了不让客户端知道文件的下载地址我们不直接公开文件的url,而是采用Response.WriteFile的形式输出文件,当我们需要直接在客户端的浏览器上打开这个文件的时候问题来了,如果我们不设定Response.ContentType的话,非文本文件在浏览器上直接将会直接输出得到的结果只能是乱码,但是ContentType非常多,如果采用switch-case的方法代码比较臃肿,而且还有可能遗留扩展名,我们打开注册表可以看到每一种文件在注册表中都能找到ContentType(可以按照value查找Content Type关键词看到),既然这样就能尝试从注册表读取ContentType了。下面是一个例子:

using Microsoft.Win32;

string filename=@"c:\11.doc";
            System.IO.FileInfo fi
=new System.IO.FileInfo(filename);
            
string fileextname=fi.Extension;
            
string DEFAULT_CONTENT_TYPE = "application/unknown";
            RegistryKey regkey,fileextkey;
            
string filecontenttype;
            
try 
            {                
                regkey
=Registry.ClassesRoot;                
                fileextkey
=regkey.OpenSubKey(fileextname);                
                filecontenttype
=fileextkey.GetValue("Content Type",DEFAULT_CONTENT_TYPE).ToString();
            }
            
catch
            {
                filecontenttype
=DEFAULT_CONTENT_TYPE;
            }        
            Response.Clear();
            Response.AddHeader(
"Content-Disposition""inline; filename=" + Server.UrlEncode(filename)); 
            Response.ContentType
=filecontenttype;
            Response.WriteFile(filename); 

经过测试发现,虽然ContentType是正确的,但是例如pdf等文件还是打开错误,不知道是什么原因。。。
posted on 2005-06-21 09:48 lovecherry 阅读(2524) 评论(2)  编辑 收藏 所属分类: webform

Feedback


  回复  引用  查看    

可能要用这样的Content-Disposition吧:
Response.AddHeader("Content-Disposition", "attachment;FileName="+YourFileName);

  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-06-21 10:43 编辑过
 
另存  打印
最新IT新闻:
· 万名Linux使用者向暴雪请愿Linux版《Diablo III》
· 56.com我乐网将全面转行 退出视频行业
· Joost借道TOM在线 将正式进军中国
· 微软副总裁公开承认Vista存在问题
· 互联网DNS存在重大漏洞 黑客可能控制网络流量