【问题标题】:Determine the file type using C#使用 C# 确定文件类型
【发布时间】:2012-07-17 20:37:23
【问题描述】:

我有一个网页,其中包含文件上传组件,可以仅将允许的文档类型上传到我的系统(仅限图像)。我不想使用正则表达式来确定文件类型和使用扩展名。

如果在 C# 中有任何其他确定文件类型的方法,请告诉我。

【问题讨论】:

  • 你应该可以从请求中的content-type信息中得到一些信息
  • 我会在您接受的图像格式的数量上挑剔,并且只使用您知道解压缩器可以免费利用的少数几种格式。

标签: c#


【解决方案1】:

.NET 中有一个帮助类,称为 Path。 你需要的是

Path.GetExtension();

它位于 System.IO 命名空间中。

【讨论】:

  • Peter Ritchie 也是对的,您应该能够获得 MIME 类型,但我不确定正确的方法。
  • 我可以轻松上传带有“jpg”或“txt”扩展名的 exe。
  • AFAIK 对打包可执行文件的保护是病毒防护/防火墙问题,而不是程序本身的工作。但再一次,我不是该主题的专家。
  • 非常感谢您的帮助。我试图深入研究的原因是最近我们的网站遭到了攻击。入侵者使用文件上传功能入侵系统。我们已禁用此功能一段时间。但是,我们计划在制定具体解决方案后再次使用文件上传功能。感谢您的帮助。让我尝试运行上面的代码,看看效果如何。最好的问候
  • @timschmelter 有问题吗?
【解决方案2】:
        HttpFileCollection hfc = Request.Files;
        for (int i = 0; i < hfc.Count - 1; i++)
        {
            HttpPostedFile hpf = hfc(i);
            if (hpf.ContentType == "image/jpeg")
            {

                //its a jpeg

            }
        }

【讨论】:

  • 您所做的就是检查文件应该是什么。它可以是任何东西。这是一个很好的第一步,但需要进行一些内容检查。
【解决方案3】:

看到一个类似的例子。应该为您指明正确的方向。来自 msdn 网站。

string fileName = @"C:\mydir.old\myfile.ext";
string path = @"C:\mydir.old\";
string extension;

extension = Path.GetExtension(fileName);
Console.WriteLine("GetExtension('{0}') returns '{1}'", 
fileName, extension);

extension = Path.GetExtension(path);
Console.WriteLine("GetExtension('{0}') returns '{1}'", 
path, extension);

// This code produces output similar to the following:
//
// GetExtension('C:\mydir.old\myfile.ext') returns '.ext'
// GetExtension('C:\mydir.old\') returns ''

【讨论】:

    【解决方案4】:

    听起来您正在寻找FindMimeFromDatathis question 中有很多额外的信息和代码。

    【讨论】:

      【解决方案5】:

      我刚刚将我的 VB.NET 类转换为 C# 以检测 mime 类型。它们将通过嗅探文件的前 256 个字节(urlmon.dll - f.e. Internet Explorer 使用)和一组已知类型的组合来识别。

      您还可以使用它来检查文件是否是它所伪装的(如果扩展名与类型匹配)。

      // check whether or not the uploaded file is an image:
      var contentType = MimeTypes.GetContentType(FileUpload1.PostedFile.FileName);
      if(contentType.StartsWith("image"))
      {
          // do something with the image ...
      }
      

      课程如下:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Runtime.InteropServices;
      using System.IO;
      
      public class MimeTypes
      {
          private static List<string> knownTypes;
      
          private static Dictionary<string, string> mimeTypes;
      
          [DllImport("urlmon.dll", CharSet = CharSet.Auto)]
          private static extern UInt32 FindMimeFromData(
              UInt32 pBC, [MarshalAs(UnmanagedType.LPStr)]
              string pwzUrl, [MarshalAs(UnmanagedType.LPArray)]
              byte[] pBuffer, UInt32 cbSize, [MarshalAs(UnmanagedType.LPStr)]
              string pwzMimeProposed, UInt32 dwMimeFlags, ref UInt32 ppwzMimeOut, UInt32 dwReserverd
          );
      
          public static string GetContentType(string fileName)
          {
              if (knownTypes == null || mimeTypes == null)
                  InitializeMimeTypeLists();
              string contentType = "";
              string extension = System.IO.Path.GetExtension(fileName).Replace(".", "").ToLower();
              mimeTypes.TryGetValue(extension, out contentType);
              if (string.IsNullOrEmpty(contentType) || knownTypes.Contains(contentType))
              {
                  string headerType = ScanFileForMimeType(fileName);
                  if (headerType != "application/octet-stream" || string.IsNullOrEmpty(contentType))
                      contentType = headerType;
              }
              return contentType;
          }
      
          private static string ScanFileForMimeType(string fileName)
          {
              try
              {
                  byte[] buffer = new byte[256];
                  using (FileStream fs = new FileStream(fileName, FileMode.Open))
                  {
                      int readLength = Convert.ToInt32(Math.Min(256, fs.Length));
                      fs.Read(buffer, 0, readLength);
                  }
      
                  UInt32 mimeType = default(UInt32);
                  FindMimeFromData(0, null, buffer, 256, null, 0, ref mimeType, 0);
                  IntPtr mimeTypePtr = new IntPtr(mimeType);
                  string mime = Marshal.PtrToStringUni(mimeTypePtr);
                  Marshal.FreeCoTaskMem(mimeTypePtr);
                  if (string.IsNullOrEmpty(mime))
                      mime = "application/octet-stream";
                  return mime;
              } catch (Exception ex)
              {
                  return "application/octet-stream";
              }
          }
      
          private static void InitializeMimeTypeLists()
          {
              knownTypes = new string[] {
              "text/plain",
              "text/html",
              "text/xml",
              "text/richtext",
              "text/scriptlet",
              "audio/x-aiff",
              "audio/basic",
              "audio/mid",
              "audio/wav",
              "image/gif",
              "image/jpeg",
              "image/pjpeg",
              "image/png",
              "image/x-png",
              "image/tiff",
              "image/bmp",
              "image/x-xbitmap",
              "image/x-jg",
              "image/x-emf",
              "image/x-wmf",
              "video/avi",
              "video/mpeg",
              "application/octet-stream",
              "application/postscript",
              "application/base64",
              "application/macbinhex40",
              "application/pdf",
              "application/xml",
              "application/atom+xml",
              "application/rss+xml",
              "application/x-compressed",
              "application/x-zip-compressed",
              "application/x-gzip-compressed",
              "application/java",
              "application/x-msdownload"
          }.ToList();
      
              mimeTypes = new Dictionary<string, string>();
              mimeTypes.Add("3dm", "x-world/x-3dmf");
              mimeTypes.Add("3dmf", "x-world/x-3dmf");
              mimeTypes.Add("a", "application/octet-stream");
              mimeTypes.Add("aab", "application/x-authorware-bin");
              mimeTypes.Add("aam", "application/x-authorware-map");
              mimeTypes.Add("aas", "application/x-authorware-seg");
              mimeTypes.Add("abc", "text/vnd.abc");
              mimeTypes.Add("acgi", "text/html");
              mimeTypes.Add("afl", "video/animaflex");
              mimeTypes.Add("ai", "application/postscript");
              mimeTypes.Add("aif", "audio/aiff");
              mimeTypes.Add("aifc", "audio/aiff");
              mimeTypes.Add("aiff", "audio/aiff");
              mimeTypes.Add("aim", "application/x-aim");
              mimeTypes.Add("aip", "text/x-audiosoft-intra");
              mimeTypes.Add("ani", "application/x-navi-animation");
              mimeTypes.Add("aos", "application/x-nokia-9000-communicator-add-on-software");
              mimeTypes.Add("aps", "application/mime");
              mimeTypes.Add("arc", "application/octet-stream");
              mimeTypes.Add("arj", "application/arj");
              mimeTypes.Add("art", "image/x-jg");
              mimeTypes.Add("asf", "video/x-ms-asf");
              mimeTypes.Add("asm", "text/x-asm");
              mimeTypes.Add("asp", "text/asp");
              mimeTypes.Add("asx", "application/x-mplayer2");
              mimeTypes.Add("au", "audio/basic");
              mimeTypes.Add("avi", "video/avi");
              mimeTypes.Add("avs", "video/avs-video");
              mimeTypes.Add("bcpio", "application/x-bcpio");
              mimeTypes.Add("bin", "application/octet-stream");
              mimeTypes.Add("bm", "image/bmp");
              mimeTypes.Add("bmp", "image/bmp");
              mimeTypes.Add("boo", "application/book");
              mimeTypes.Add("book", "application/book");
              mimeTypes.Add("boz", "application/x-bzip2");
              mimeTypes.Add("bsh", "application/x-bsh");
              mimeTypes.Add("bz", "application/x-bzip");
              mimeTypes.Add("bz2", "application/x-bzip2");
              mimeTypes.Add("c", "text/plain");
              mimeTypes.Add("c++", "text/plain");
              mimeTypes.Add("cat", "application/vnd.ms-pki.seccat");
              mimeTypes.Add("cc", "text/plain");
              mimeTypes.Add("ccad", "application/clariscad");
              mimeTypes.Add("cco", "application/x-cocoa");
              mimeTypes.Add("cdf", "application/cdf");
              mimeTypes.Add("cer", "application/pkix-cert");
              mimeTypes.Add("cha", "application/x-chat");
              mimeTypes.Add("chat", "application/x-chat");
              mimeTypes.Add("class", "application/java");
              mimeTypes.Add("com", "application/octet-stream");
              mimeTypes.Add("conf", "text/plain");
              mimeTypes.Add("cpio", "application/x-cpio");
              mimeTypes.Add("cpp", "text/x-c");
              mimeTypes.Add("cpt", "application/x-cpt");
              mimeTypes.Add("crl", "application/pkcs-crl");
              mimeTypes.Add("css", "text/css");
              mimeTypes.Add("def", "text/plain");
              mimeTypes.Add("der", "application/x-x509-ca-cert");
              mimeTypes.Add("dif", "video/x-dv");
              mimeTypes.Add("dir", "application/x-director");
              mimeTypes.Add("dl", "video/dl");
              mimeTypes.Add("doc", "application/msword");
              mimeTypes.Add("dot", "application/msword");
              mimeTypes.Add("dp", "application/commonground");
              mimeTypes.Add("drw", "application/drafting");
              mimeTypes.Add("dump", "application/octet-stream");
              mimeTypes.Add("dv", "video/x-dv");
              mimeTypes.Add("dvi", "application/x-dvi");
              mimeTypes.Add("dwf", "drawing/x-dwf (old)");
              mimeTypes.Add("dwg", "application/acad");
              mimeTypes.Add("dxf", "application/dxf");
              mimeTypes.Add("eps", "application/postscript");
              mimeTypes.Add("es", "application/x-esrehber");
              mimeTypes.Add("etx", "text/x-setext");
              mimeTypes.Add("evy", "application/envoy");
              mimeTypes.Add("exe", "application/octet-stream");
              mimeTypes.Add("f", "text/plain");
              mimeTypes.Add("f90", "text/x-fortran");
              mimeTypes.Add("fdf", "application/vnd.fdf");
              mimeTypes.Add("fif", "image/fif");
              mimeTypes.Add("fli", "video/fli");
              mimeTypes.Add("flv", "video/x-flv");
              mimeTypes.Add("for", "text/x-fortran");
              mimeTypes.Add("fpx", "image/vnd.fpx");
              mimeTypes.Add("g", "text/plain");
              mimeTypes.Add("g3", "image/g3fax");
              mimeTypes.Add("gif", "image/gif");
              mimeTypes.Add("gl", "video/gl");
              mimeTypes.Add("gsd", "audio/x-gsm");
              mimeTypes.Add("gtar", "application/x-gtar");
              mimeTypes.Add("gz", "application/x-compressed");
              mimeTypes.Add("h", "text/plain");
              mimeTypes.Add("help", "application/x-helpfile");
              mimeTypes.Add("hgl", "application/vnd.hp-hpgl");
              mimeTypes.Add("hh", "text/plain");
              mimeTypes.Add("hlp", "application/x-winhelp");
              mimeTypes.Add("htc", "text/x-component");
              mimeTypes.Add("htm", "text/html");
              mimeTypes.Add("html", "text/html");
              mimeTypes.Add("htmls", "text/html");
              mimeTypes.Add("htt", "text/webviewhtml");
              mimeTypes.Add("htx", "text/html");
              mimeTypes.Add("ice", "x-conference/x-cooltalk");
              mimeTypes.Add("ico", "image/x-icon");
              mimeTypes.Add("idc", "text/plain");
              mimeTypes.Add("ief", "image/ief");
              mimeTypes.Add("iefs", "image/ief");
              mimeTypes.Add("iges", "application/iges");
              mimeTypes.Add("igs", "application/iges");
              mimeTypes.Add("ima", "application/x-ima");
              mimeTypes.Add("imap", "application/x-httpd-imap");
              mimeTypes.Add("inf", "application/inf");
              mimeTypes.Add("ins", "application/x-internett-signup");
              mimeTypes.Add("ip", "application/x-ip2");
              mimeTypes.Add("isu", "video/x-isvideo");
              mimeTypes.Add("it", "audio/it");
              mimeTypes.Add("iv", "application/x-inventor");
              mimeTypes.Add("ivr", "i-world/i-vrml");
              mimeTypes.Add("ivy", "application/x-livescreen");
              mimeTypes.Add("jam", "audio/x-jam");
              mimeTypes.Add("jav", "text/plain");
              mimeTypes.Add("java", "text/plain");
              mimeTypes.Add("jcm", "application/x-java-commerce");
              mimeTypes.Add("jfif", "image/jpeg");
              mimeTypes.Add("jfif-tbnl", "image/jpeg");
              mimeTypes.Add("jpe", "image/jpeg");
              mimeTypes.Add("jpeg", "image/jpeg");
              mimeTypes.Add("jpg", "image/jpeg");
              mimeTypes.Add("jps", "image/x-jps");
              mimeTypes.Add("js", "application/x-javascript");
              mimeTypes.Add("jut", "image/jutvision");
              mimeTypes.Add("kar", "audio/midi");
              mimeTypes.Add("ksh", "application/x-ksh");
              mimeTypes.Add("la", "audio/nspaudio");
              mimeTypes.Add("lam", "audio/x-liveaudio");
              mimeTypes.Add("latex", "application/x-latex");
              mimeTypes.Add("lha", "application/lha");
              mimeTypes.Add("lhx", "application/octet-stream");
              mimeTypes.Add("list", "text/plain");
              mimeTypes.Add("lma", "audio/nspaudio");
              mimeTypes.Add("log", "text/plain");
              mimeTypes.Add("lsp", "application/x-lisp");
              mimeTypes.Add("lst", "text/plain");
              mimeTypes.Add("lsx", "text/x-la-asf");
              mimeTypes.Add("ltx", "application/x-latex");
              mimeTypes.Add("lzh", "application/octet-stream");
              mimeTypes.Add("lzx", "application/lzx");
              mimeTypes.Add("m", "text/plain");
              mimeTypes.Add("m1v", "video/mpeg");
              mimeTypes.Add("m2a", "audio/mpeg");
              mimeTypes.Add("m2v", "video/mpeg");
              mimeTypes.Add("m3u", "audio/x-mpequrl");
              mimeTypes.Add("man", "application/x-troff-man");
              mimeTypes.Add("map", "application/x-navimap");
              mimeTypes.Add("mar", "text/plain");
              mimeTypes.Add("mbd", "application/mbedlet");
              mimeTypes.Add("mc$", "application/x-magic-cap-package-1.0");
              mimeTypes.Add("mcd", "application/mcad");
              mimeTypes.Add("mcf", "image/vasa");
              mimeTypes.Add("mcp", "application/netmc");
              mimeTypes.Add("me", "application/x-troff-me");
              mimeTypes.Add("mht", "message/rfc822");
              mimeTypes.Add("mhtml", "message/rfc822");
              mimeTypes.Add("mid", "audio/midi");
              mimeTypes.Add("midi", "audio/midi");
              mimeTypes.Add("mif", "application/x-frame");
              mimeTypes.Add("mime", "message/rfc822");
              mimeTypes.Add("mjf", "audio/x-vnd.audioexplosion.mjuicemediafile");
              mimeTypes.Add("mjpg", "video/x-motion-jpeg");
              mimeTypes.Add("mm", "application/base64");
              mimeTypes.Add("mme", "application/base64");
              mimeTypes.Add("mod", "audio/mod");
              mimeTypes.Add("moov", "video/quicktime");
              mimeTypes.Add("mov", "video/quicktime");
              mimeTypes.Add("movie", "video/x-sgi-movie");
              mimeTypes.Add("mp2", "audio/mpeg");
              mimeTypes.Add("mp3", "audio/mpeg3");
              mimeTypes.Add("mpa", "audio/mpeg");
              mimeTypes.Add("mpc", "application/x-project");
              mimeTypes.Add("mpe", "video/mpeg");
              mimeTypes.Add("mpeg", "video/mpeg");
              mimeTypes.Add("mpg", "video/mpeg");
              mimeTypes.Add("mpga", "audio/mpeg");
              mimeTypes.Add("mpp", "application/vnd.ms-project");
              mimeTypes.Add("mpt", "application/x-project");
              mimeTypes.Add("mpv", "application/x-project");
              mimeTypes.Add("mpx", "application/x-project");
              mimeTypes.Add("mrc", "application/marc");
              mimeTypes.Add("ms", "application/x-troff-ms");
              mimeTypes.Add("mv", "video/x-sgi-movie");
              mimeTypes.Add("my", "audio/make");
              mimeTypes.Add("mzz", "application/x-vnd.audioexplosion.mzz");
              mimeTypes.Add("nap", "image/naplps");
              mimeTypes.Add("naplps", "image/naplps");
              mimeTypes.Add("nc", "application/x-netcdf");
              mimeTypes.Add("ncm", "application/vnd.nokia.configuration-message");
              mimeTypes.Add("nif", "image/x-niff");
              mimeTypes.Add("niff", "image/x-niff");
              mimeTypes.Add("nix", "application/x-mix-transfer");
              mimeTypes.Add("nsc", "application/x-conference");
              mimeTypes.Add("nvd", "application/x-navidoc");
              mimeTypes.Add("o", "application/octet-stream");
              mimeTypes.Add("oda", "application/oda");
              mimeTypes.Add("omc", "application/x-omc");
              mimeTypes.Add("omcd", "application/x-omcdatamaker");
              mimeTypes.Add("omcr", "application/x-omcregerator");
              mimeTypes.Add("p", "text/x-pascal");
              mimeTypes.Add("p10", "application/pkcs10");
              mimeTypes.Add("p12", "application/pkcs-12");
              mimeTypes.Add("p7a", "application/x-pkcs7-signature");
              mimeTypes.Add("p7c", "application/pkcs7-mime");
              mimeTypes.Add("pas", "text/pascal");
              mimeTypes.Add("pbm", "image/x-portable-bitmap");
              mimeTypes.Add("pcl", "application/vnd.hp-pcl");
              mimeTypes.Add("pct", "image/x-pict");
              mimeTypes.Add("pcx", "image/x-pcx");
              mimeTypes.Add("pdf", "application/pdf");
              mimeTypes.Add("pfunk", "audio/make");
              mimeTypes.Add("pgm", "image/x-portable-graymap");
              mimeTypes.Add("pic", "image/pict");
              mimeTypes.Add("pict", "image/pict");
              mimeTypes.Add("pkg", "application/x-newton-compatible-pkg");
              mimeTypes.Add("pko", "application/vnd.ms-pki.pko");
              mimeTypes.Add("pl", "text/plain");
              mimeTypes.Add("plx", "application/x-pixclscript");
              mimeTypes.Add("pm", "image/x-xpixmap");
              mimeTypes.Add("png", "image/png");
              mimeTypes.Add("pnm", "application/x-portable-anymap");
              mimeTypes.Add("pot", "application/mspowerpoint");
              mimeTypes.Add("pov", "model/x-pov");
              mimeTypes.Add("ppa", "application/vnd.ms-powerpoint");
              mimeTypes.Add("ppm", "image/x-portable-pixmap");
              mimeTypes.Add("pps", "application/mspowerpoint");
              mimeTypes.Add("ppt", "application/mspowerpoint");
              mimeTypes.Add("ppz", "application/mspowerpoint");
              mimeTypes.Add("pre", "application/x-freelance");
              mimeTypes.Add("prt", "application/pro_eng");
              mimeTypes.Add("ps", "application/postscript");
              mimeTypes.Add("psd", "application/octet-stream");
              mimeTypes.Add("pvu", "paleovu/x-pv");
              mimeTypes.Add("pwz", "application/vnd.ms-powerpoint");
              mimeTypes.Add("py", "text/x-script.phyton");
              mimeTypes.Add("pyc", "applicaiton/x-bytecode.python");
              mimeTypes.Add("qcp", "audio/vnd.qcelp");
              mimeTypes.Add("qd3", "x-world/x-3dmf");
              mimeTypes.Add("qd3d", "x-world/x-3dmf");
              mimeTypes.Add("qif", "image/x-quicktime");
              mimeTypes.Add("qt", "video/quicktime");
              mimeTypes.Add("qtc", "video/x-qtc");
              mimeTypes.Add("qti", "image/x-quicktime");
              mimeTypes.Add("qtif", "image/x-quicktime");
              mimeTypes.Add("ra", "audio/x-pn-realaudio");
              mimeTypes.Add("ram", "audio/x-pn-realaudio");
              mimeTypes.Add("ras", "application/x-cmu-raster");
              mimeTypes.Add("rast", "image/cmu-raster");
              mimeTypes.Add("rexx", "text/x-script.rexx");
              mimeTypes.Add("rf", "image/vnd.rn-realflash");
              mimeTypes.Add("rgb", "image/x-rgb");
              mimeTypes.Add("rm", "application/vnd.rn-realmedia");
              mimeTypes.Add("rmi", "audio/mid");
              mimeTypes.Add("rmm", "audio/x-pn-realaudio");
              mimeTypes.Add("rmp", "audio/x-pn-realaudio");
              mimeTypes.Add("rng", "application/ringing-tones");
              mimeTypes.Add("rnx", "application/vnd.rn-realplayer");
              mimeTypes.Add("roff", "application/x-troff");
              mimeTypes.Add("rp", "image/vnd.rn-realpix");
              mimeTypes.Add("rpm", "audio/x-pn-realaudio-plugin");
              mimeTypes.Add("rt", "text/richtext");
              mimeTypes.Add("rtf", "text/richtext");
              mimeTypes.Add("rtx", "application/rtf");
              mimeTypes.Add("rv", "video/vnd.rn-realvideo");
              mimeTypes.Add("s", "text/x-asm");
              mimeTypes.Add("s3m", "audio/s3m");
              mimeTypes.Add("saveme", "application/octet-stream");
              mimeTypes.Add("sbk", "application/x-tbook");
              mimeTypes.Add("scm", "application/x-lotusscreencam");
              mimeTypes.Add("sdml", "text/plain");
              mimeTypes.Add("sdp", "application/sdp");
              mimeTypes.Add("sdr", "application/sounder");
              mimeTypes.Add("sea", "application/sea");
              mimeTypes.Add("set", "application/set");
              mimeTypes.Add("sgm", "text/sgml");
              mimeTypes.Add("sgml", "text/sgml");
              mimeTypes.Add("sh", "application/x-bsh");
              mimeTypes.Add("shtml", "text/html");
              mimeTypes.Add("sid", "audio/x-psid");
              mimeTypes.Add("sit", "application/x-sit");
              mimeTypes.Add("skd", "application/x-koan");
              mimeTypes.Add("skm", "application/x-koan");
              mimeTypes.Add("skp", "application/x-koan");
              mimeTypes.Add("skt", "application/x-koan");
              mimeTypes.Add("sl", "application/x-seelogo");
              mimeTypes.Add("smi", "application/smil");
              mimeTypes.Add("smil", "application/smil");
              mimeTypes.Add("snd", "audio/basic");
              mimeTypes.Add("sol", "application/solids");
              mimeTypes.Add("spc", "application/x-pkcs7-certificates");
              mimeTypes.Add("spl", "application/futuresplash");
              mimeTypes.Add("spr", "application/x-sprite");
              mimeTypes.Add("sprite", "application/x-sprite");
              mimeTypes.Add("src", "application/x-wais-source");
              mimeTypes.Add("ssi", "text/x-server-parsed-html");
              mimeTypes.Add("ssm", "application/streamingmedia");
              mimeTypes.Add("sst", "application/vnd.ms-pki.certstore");
              mimeTypes.Add("step", "application/step");
              mimeTypes.Add("stl", "application/sla");
              mimeTypes.Add("stp", "application/step");
              mimeTypes.Add("sv4cpio", "application/x-sv4cpio");
              mimeTypes.Add("sv4crc", "application/x-sv4crc");
              mimeTypes.Add("svf", "image/vnd.dwg");
              mimeTypes.Add("svr", "application/x-world");
              mimeTypes.Add("swf", "application/x-shockwave-flash");
              mimeTypes.Add("t", "application/x-troff");
              mimeTypes.Add("talk", "text/x-speech");
              mimeTypes.Add("tar", "application/x-tar");
              mimeTypes.Add("tbk", "application/toolbook");
              mimeTypes.Add("tcl", "application/x-tcl");
              mimeTypes.Add("tcsh", "text/x-script.tcsh");
              mimeTypes.Add("tex", "application/x-tex");
              mimeTypes.Add("texi", "application/x-texinfo");
              mimeTypes.Add("texinfo", "application/x-texinfo");
              mimeTypes.Add("text", "text/plain");
              mimeTypes.Add("tgz", "application/x-compressed");
              mimeTypes.Add("tif", "image/tiff");
              mimeTypes.Add("tr", "application/x-troff");
              mimeTypes.Add("tsi", "audio/tsp-audio");
              mimeTypes.Add("tsp", "audio/tsplayer");
              mimeTypes.Add("tsv", "text/tab-separated-values");
              mimeTypes.Add("turbot", "image/florian");
              mimeTypes.Add("txt", "text/plain");
              mimeTypes.Add("uil", "text/x-uil");
              mimeTypes.Add("uni", "text/uri-list");
              mimeTypes.Add("unis", "text/uri-list");
              mimeTypes.Add("unv", "application/i-deas");
              mimeTypes.Add("uri", "text/uri-list");
              mimeTypes.Add("uris", "text/uri-list");
              mimeTypes.Add("ustar", "application/x-ustar");
              mimeTypes.Add("uu", "application/octet-stream");
              mimeTypes.Add("vcd", "application/x-cdlink");
              mimeTypes.Add("vcs", "text/x-vcalendar");
              mimeTypes.Add("vda", "application/vda");
              mimeTypes.Add("vdo", "video/vdo");
              mimeTypes.Add("vew", "application/groupwise");
              mimeTypes.Add("viv", "video/vivo");
              mimeTypes.Add("vivo", "video/vivo");
              mimeTypes.Add("vmd", "application/vocaltec-media-desc");
              mimeTypes.Add("vmf", "application/vocaltec-media-file");
              mimeTypes.Add("voc", "audio/voc");
              mimeTypes.Add("vos", "video/vosaic");
              mimeTypes.Add("vox", "audio/voxware");
              mimeTypes.Add("vqe", "audio/x-twinvq-plugin");
              mimeTypes.Add("vqf", "audio/x-twinvq");
              mimeTypes.Add("vql", "audio/x-twinvq-plugin");
              mimeTypes.Add("vrml", "application/x-vrml");
              mimeTypes.Add("vrt", "x-world/x-vrt");
              mimeTypes.Add("vsd", "application/x-visio");
              mimeTypes.Add("vst", "application/x-visio");
              mimeTypes.Add("vsw", "application/x-visio");
              mimeTypes.Add("w60", "application/wordperfect6.0");
              mimeTypes.Add("w61", "application/wordperfect6.1");
              mimeTypes.Add("w6w", "application/msword");
              mimeTypes.Add("wav", "audio/wav");
              mimeTypes.Add("wb1", "application/x-qpro");
              mimeTypes.Add("wbmp", "image/vnd.wap.wbmp");
              mimeTypes.Add("web", "application/vnd.xara");
              mimeTypes.Add("wiz", "application/msword");
              mimeTypes.Add("wk1", "application/x-123");
              mimeTypes.Add("wmf", "windows/metafile");
              mimeTypes.Add("wml", "text/vnd.wap.wml");
              mimeTypes.Add("wmlc", "application/vnd.wap.wmlc");
              mimeTypes.Add("wmls", "text/vnd.wap.wmlscript");
              mimeTypes.Add("wmlsc", "application/vnd.wap.wmlscriptc");
              mimeTypes.Add("word", "application/msword");
              mimeTypes.Add("wp", "application/wordperfect");
              mimeTypes.Add("wp5", "application/wordperfect");
              mimeTypes.Add("wp6", "application/wordperfect");
              mimeTypes.Add("wpd", "application/wordperfect");
              mimeTypes.Add("wq1", "application/x-lotus");
              mimeTypes.Add("wri", "application/mswrite");
              mimeTypes.Add("wrl", "application/x-world");
              mimeTypes.Add("wrz", "model/vrml");
              mimeTypes.Add("wsc", "text/scriplet");
              mimeTypes.Add("wsrc", "application/x-wais-source");
              mimeTypes.Add("wtk", "application/x-wintalk");
              mimeTypes.Add("xbm", "image/x-xbitmap");
              mimeTypes.Add("xdr", "video/x-amt-demorun");
              mimeTypes.Add("xgz", "xgl/drawing");
              mimeTypes.Add("xif", "image/vnd.xiff");
              mimeTypes.Add("xl", "application/excel");
              mimeTypes.Add("xla", "application/excel");
              mimeTypes.Add("xlb", "application/excel");
              mimeTypes.Add("xlc", "application/excel");
              mimeTypes.Add("xld", "application/excel");
              mimeTypes.Add("xlk", "application/excel");
              mimeTypes.Add("xll", "application/excel");
              mimeTypes.Add("xlm", "application/excel");
              mimeTypes.Add("xls", "application/excel");
              mimeTypes.Add("xlsx", "application/excel");
              mimeTypes.Add("xlt", "application/excel");
              mimeTypes.Add("xlv", "application/excel");
              mimeTypes.Add("xlw", "application/excel");
              mimeTypes.Add("xm", "audio/xm");
              mimeTypes.Add("xml", "text/xml");
              mimeTypes.Add("xmz", "xgl/movie");
              mimeTypes.Add("xpix", "application/x-vnd.ls-xpix");
              mimeTypes.Add("xpm", "image/x-xpixmap");
              mimeTypes.Add("x-png", "image/png");
              mimeTypes.Add("xsr", "video/x-amt-showrun");
              mimeTypes.Add("xwd", "image/x-xwd");
              mimeTypes.Add("xyz", "chemical/x-pdb");
              mimeTypes.Add("z", "application/x-compress");
              mimeTypes.Add("zip", "application/x-compressed");
              mimeTypes.Add("zoo", "application/octet-stream");
              mimeTypes.Add("zsh", "text/x-script.zsh");
          }
      }
      

      当 mime 类型未知且仅知道它是 application/octet-stream 是不够的时,您必须更新此列表。检查扩展名是否为 txt 但 mime 类型为二进制数据可能就足够了,因为这意味着该文件不是它所伪装的。


      除此之外,使用RegularExpressionValidator 真的更容易。

      例如(仅 jpg 图像):

      <asp:FileUpload ID="FileUpload1" runat="server" /><br />
      <br />
      <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" 
       Text="Upload File" />&nbsp;<br />
      <br />
      <asp:Label ID="Label1" runat="server"></asp:Label>
      <asp:RegularExpressionValidator 
       id="RegularExpressionValidator1" runat="server" 
       ErrorMessage="Only jpeg files are allowed!" 
       ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))
          +(.jpg|.JPG|.jpeg|.JPEG)$" 
       ControlToValidate="FileUpload1"></asp:RegularExpressionValidator>
      

      在代码隐藏中:

      if (FileUpload1.HasFile)
      {
          string fileExt = 
             System.IO.Path.GetExtension(FileUpload1.FileName);
      
          if (fileExt == ".jpeg" || fileExt == ".jpg")
          {
              //do what you want with this image
          }
          else
          {
              Label1.Text = "Only .jpeg files are allowed!";
          }
      }
      

      【讨论】:

      • 这太棒了!!!。这里有个简单的问题。如果通过更改扩展名将exe文件保存为.jpg文件,使用正则表达式的方法有多好。
      • @YagyaSharma:RegularExpression 方法只检查 FileUpload 控件的 FileName。所以根本没有“深度检查”。但是你只需要在服务器端使用我的MimeTypes 类。 ScanFileForMimeType 将表明它不是图像类型,而是application/octet-stream
      • 我使用了 MIME 类型的方法来实现这个功能。但是,一旦我从文件选择对话框中选择 exe 文件,页面就会刷新并出现错误消息“无法显示页面”。知道为什么会发生这种情况。问候-Yagya
      • 那么你确定文件不是太大了吗?默认最大请求大小为 4MB。您可以更改 web.config 中的设置以允许更大的请求。 httpRuntime 元素的 maxRequestLength 属性控制它,您可以在 web.config 文件中更改它。此链接显示了 httpRuntime 元素的架构:msdn2.microsoft.com/en-us/library/e1f13641(VS.80).aspx
      • 这个blog 讨论了 urlmon 方法的一些问题并给出了补救代码。他似乎不太擅长复制/粘贴,但他的重构进行了一些调整以使其更安全(正如作者所声称的那样)。
      【解决方案6】:

      你可以使用Myrmec来识别文件类型,这个库使用文件字节头。这个库在 nuget "Myrmec" 上可用,这是repo,myrmec 也支持 mime 类型,你可以试试。代码会是这样的:

      // create a sniffer instance.
      Sniffer sniffer = new Sniffer();
      
      // populate with mata data.
      sniffer.Populate(FileTypes.CommonFileTypes);
      
      // get file head byte, may be 20 bytes enough.
      byte[] fileHead = ReadFileHead();
      
      // start match.
      List<string> results = sniffer.Match(fileHead);
      

      【讨论】:

        【解决方案7】:

        这样写代码从来都不是一个好主意:

        string fileExt = System.IO.Path.GetExtension(FileUpload1.FileName);
        
        if (fileExt == ".jpeg" || fileExt == ".jpg")
        {
            //do what you want with this image
        }
        

        这样做的原因是它会给你文件名的扩展名。让我们假设用户足够聪明,可以将文件名从 foo.exe 更改为 foo.png 并上传。在此代码示例中验证将通过,这对您不利。

        识别文件类型的唯一适当方法是检查它的魔术字节。根据维基百科,这个术语(“幻数”)用于文件开头的一组特定的 2 字节标识符,但由于任何二进制序列都可以被视为一个数字,因此文件格式的任何特征都可以唯一区分它可用于识别。这种方法可以更好地保证正确识别格式,并且通常可以确定有关文件的更精确信息。参考original post

        因为一年前我遇到了同样的问题,我创建了一个library 可以帮助您解决这种情况。它易于使用,只需几行代码,您就可以安全使用。

        【讨论】:

        • 谢谢,你的图书馆看起来很有趣
        【解决方案8】:
        • 使用 FileExtensionContentTypeProvider()
        [HttpGet]
        public string Get(string fileName)
        {
            var provider = new FileExtensionContentTypeProvider();
            string contentType;
            if(!provider.TryGetContentType(fileName, out contentType))
            {
                contentType = "application/octet-stream";
            }
            return contentType;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-20
          • 1970-01-01
          • 2011-09-16
          • 2012-11-05
          • 2011-02-24
          • 2011-01-28
          • 1970-01-01
          • 2011-05-09
          相关资源
          最近更新 更多