zoukankan      html  css  js  c++  java
  • 如何从注册表读取文件的ContentType

         有的时候为了不让客户端知道文件的下载地址我们不直接公开文件的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等文件还是打开错误,不知道是什么原因。。。
    欢迎大家阅读我的极客时间专栏《Java业务开发常见错误100例》【全面避坑+最佳实践=健壮代码】
  • 相关阅读:
    c++输入输出,保留几位小数
    算法训练 旅行家的预算
    算法训练 拦截导弹(最长递增子序列和最长递减子序列问题,输入回车时停止输入)
    算法训练 字符串比较
    关于新博客的转移
    关于在对象内部访问实例变量的方式选择
    动态计算文本宽度和高度
    工作将近三个月的总结(未完持续)
    ViewController的.m文件代码布局规范
    Objective-C学习之Runtime
  • 原文地址:https://www.cnblogs.com/lovecherry/p/178169.html
Copyright © 2011-2022 走看看