软件人生

Jack(子游)

我的目标:做世界一流的软件,成为优秀的项目管理者 主要专注行业: Cms(content manage system) OA CRM 在线营销系统 在线调查
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

正确检查上传文件类型或者get mine type from file

Posted on 2009-07-17 16:17  子游  阅读(1670)  评论(3)    收藏  举报

 

  Get mine type from file .

  当系统希望限制某些文件上传到系统上,一般做法是检查文件扩展名。这样做法如果用户把扩展名修改了,这种检查就失效了。

  如果单存检查文件类型代码如下:

   string ext = System.IO.Path.GetExtension(Filename).ToLower();
   Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
   if (rk != null && rk.GetValue("Content Type") != null)
       mime = rk.GetValue("Content Type").ToString();
    return mime;

   这种只是简单获取文件的mine type,但一旦修改了扩展名,这种方法就无效。

  下面代码可以轻松解决这个问题。

   using System;
   using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Runtime.InteropServices;

     [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
        private extern static System.UInt32 FindMimeFromData(
            System.UInt32 pBC,
            [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
            [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
            System.UInt32 cbSize,
            [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
            System.UInt32 dwMimeFlags,
            out System.UInt32 ppwzMimeOut,
            System.UInt32 dwReserverd
        );

        public string getMimeFromFile(string filename)
        {
            if (!File.Exists(filename))
                throw new FileNotFoundException(filename + " not found");

            byte[] buffer = new byte[256];
            using (FileStream fs = new FileStream(filename, FileMode.Open))
            {
                if (fs.Length >= 256)
                    fs.Read(buffer, 0, 256);
                else
                    fs.Read(buffer, 0, (int)fs.Length);
            }
            try
            {
                System.UInt32 mimetype;
                FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
                System.IntPtr mimeTypePtr = new IntPtr(mimetype);
                string mime = Marshal.PtrToStringUni(mimeTypePtr);
                Marshal.FreeCoTaskMem(mimeTypePtr);
                return mime;
            }
            catch (Exception e)
            {
                return "unknown/unknown";
            }
        }

 

快乐软件人生