Подтвердить что ты не робот

Как получить содержимое/тип файла во время выполнения

Я пытаюсь динамически определить содержимое/тип входного файла. Если бы я был в приложении Windows, я мог бы написать такой код (из этого блога)

private string GetContentType(string fileName) {
    string contentType = "application/octetstream";
    string ext = System.IO.Path.GetExtension(fileName).ToLower();
    Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
    if (registryKey != null && registryKey.GetValue("Content Type") != null)
        contentType = registryKey.GetValue("Content Type").ToString();
    return contentType;
} 

Какие другие методы более подходят для приложения MVC?

Я хотел бы использовать параметр в методе Controller.File(...), который получает путь к файлу и тип содержимого.

4b9b3361

Ответ 1

Важное примечание: Этот ответ был написан в 2011 году, за несколько лет до того, как был написан главный комментарий. Пока мой ответ по-прежнему приемлем, мастер-ответ лучше и более лаконичен. Вместо этого используйте и повышайте ответ. Все ниже для потомков.

Я бы просто использовал расширение файла, а не пытался сделать что-то умное, которое может в конце концов вернуться, чтобы укусить вас в задницу.:)

Расширение файла не нужно регистрировать в вашей системе (хотя я точно не знаю, что вы делаете с файлом...). Вы можете использовать что-то вроде таблицы enum или db, которая содержит информацию о допустимых расширениях, если вы хотите отфильтровать файлы.

Обратите внимание на @Tolgahan идею. Я создал ниже перечисление С#, основанное на этом, которое должно предоставить людям исходную точку, если они захотят создать подход, основанный на db/enum/xml.

Public enum MimeTypes
{
  [Description("application/postscript")]
  ai,
  [Description("audio/x-aiff")]
  aif,
  [Description("audio/x-aiff")]
  aifc,
  [Description("audio/x-aiff")]
  aiff,
  [Description("text/plain")]
  asc,
  [Description("application/atom+xml")]
  atom,
  [Description("audio/basic")]
  au,
  [Description("video/x-msvideo")]
  avi,
  [Description("application/x-bcpio")]
  bcpio,
  [Description("application/octet-stream")]
  bin,
  [Description("image/bmp")]
  bmp,
  [Description("application/x-netcdf")]
  cdf,
  [Description("image/cgm")]
  cgm,
  [Description("application/octet-stream")]
  class,
  [Description("application/x-cpio")]
  cpio,
  [Description("application/mac-compactpro")]
  cpt,
  [Description("application/x-csh")]
  csh,
  [Description("text/css")]
  css,
  [Description("application/x-director")]
  dcr,
  [Description("video/x-dv")]
  dif,
  [Description("application/x-director")]
  dir,
  [Description("image/vnd.djvu")]
  djv,
  [Description("image/vnd.djvu")]
  djvu,
  [Description("application/octet-stream")]
  dll,
  [Description("application/octet-stream")]
  dmg,
  [Description("application/octet-stream")]
  dms,
  [Description("application/msword")]
  doc,
  [Description("application/xml-dtd")]
  dtd,
  [Description("video/x-dv")]
  dv,
  [Description("application/x-dvi")]
  dvi,
  [Description("application/x-director")]
  dxr,
  [Description("application/postscript")]
  eps,
  [Description("text/x-setext")]
  etx,
  [Description("application/octet-stream")]
  exe,
  [Description("application/andrew-inset")]
  ez,
  [Description("image/gif")]
  gif,
  [Description("application/srgs")]
  gram,
  [Description("application/srgs+xml")]
  grxml,
  [Description("application/x-gtar")]
  gtar,
  [Description("application/x-hdf")]
  hdf,
  [Description("application/mac-binhex40")]
  hqx,
  [Description("text/html")]
  htm,
  [Description("text/html")]
  html,
  [Description("x-conference/x-cooltalk")]
  ice,
  [Description("image/x-icon")]
  ico,
  [Description("text/calendar")]
  ics,
  [Description("image/ief")]
  ief,
  [Description("text/calendar")]
  ifb,
  [Description("model/iges")]
  iges,
  [Description("model/iges")]
  igs,
  [Description("application/x-java-jnlp-file")]
  jnlp,
  [Description("image/jp2")]
  jp2,
  [Description("image/jpeg")]
  jpe,
  [Description("image/jpeg")]
  jpeg,
  [Description("image/jpeg")]
  jpg,
  [Description("application/x-javascript")]
  js,
  [Description("audio/midi")]
  kar,
  [Description("application/x-latex")]
  latex,
  [Description("application/octet-stream")]
  lha,
  [Description("application/octet-stream")]
  lzh,
  [Description("audio/x-mpegurl")]
  m3u,
  [Description("audio/mp4a-latm")]
  m4a,
  [Description("audio/mp4a-latm")]
  m4b,
  [Description("audio/mp4a-latm")]
  m4p,
  [Description("video/vnd.mpegurl")]
  m4u,
  [Description("video/x-m4v")]
  m4v,
  [Description("image/x-macpaint")]
  mac,
  [Description("application/x-troff-man")]
  man,
  [Description("application/mathml+xml")]
  mathml,
  [Description("application/x-troff-me")]
  me,
  [Description("model/mesh")]
  mesh,
  [Description("audio/midi")]
  mid,
  [Description("audio/midi")]
  midi,
  [Description("application/vnd.mif")]
  mif,
  [Description("video/quicktime")]
  mov,
  [Description("video/x-sgi-movie")]
  movie,
  [Description("audio/mpeg")]
  mp2,
  [Description("audio/mpeg")]
  mp3,
  [Description("video/mp4")]
  mp4,
  [Description("video/mpeg")]
  mpe,
  [Description("video/mpeg")]
  mpeg,
  [Description("video/mpeg")]
  mpg,
  [Description("audio/mpeg")]
  mpga,
  [Description("application/x-troff-ms")]
  ms,
  [Description("model/mesh")]
  msh,
  [Description("video/vnd.mpegurl")]
  mxu,
  [Description("application/x-netcdf")]
  nc,
  [Description("application/oda")]
  oda,
  [Description("application/ogg")]
  ogg,
  [Description("image/x-portable-bitmap")]
  pbm,
  [Description("image/pict")]
  pct,
  [Description("chemical/x-pdb")]
  pdb,
  [Description("application/pdf")]
  pdf,
  [Description("image/x-portable-graymap")]
  pgm,
  [Description("application/x-chess-pgn")]
  pgn,
  [Description("image/pict")]
  pic,
  [Description("image/pict")]
  pict,
  [Description("image/png")]
  png,
  [Description("image/x-portable-anymap")]
  pnm,
  [Description("image/x-macpaint")]
  pnt,
  [Description("image/x-macpaint")]
  pntg,
  [Description("image/x-portable-pixmap")]
  ppm,
  [Description("application/vnd.ms-powerpoint")]
  ppt,
  [Description("application/postscript")]
  ps,
  [Description("video/quicktime")]
  qt,
  [Description("image/x-quicktime")]
  qti,
  [Description("image/x-quicktime")]
  qtif,
  [Description("audio/x-pn-realaudio")]
  ra,
  [Description("audio/x-pn-realaudio")]
  ram,
  [Description("image/x-cmu-raster")]
  ras,
  [Description("application/rdf+xml")]
  rdf,
  [Description("image/x-rgb")]
  rgb,
  [Description("application/vnd.rn-realmedia")]
  rm,
  [Description("application/x-troff")]
  roff,
  [Description("text/rtf")]
  rtf,
  [Description("text/richtext")]
  rtx,
  [Description("text/sgml")]
  sgm,
  [Description("text/sgml")]
  sgml,
  [Description("application/x-sh")]
  sh,
  [Description("application/x-shar")]
  shar,
  [Description("model/mesh")]
  silo,
  [Description("application/x-stuffit")]
  sit,
  [Description("application/x-koan")]
  skd,
  [Description("application/x-koan")]
  skm,
  [Description("application/x-koan")]
  skp,
  [Description("application/x-koan")]
  skt,
  [Description("application/smil")]
  smi,
  [Description("application/smil")]
  smil,
  [Description("audio/basic")]
  snd,
  [Description("application/octet-stream")]
  so,
  [Description("application/x-futuresplash")]
  spl,
  [Description("application/x-wais-source")]
  src,
  [Description("application/x-sv4cpio")]
  sv4cpio,
  [Description("application/x-sv4crc")]
  sv4crc,
  [Description("image/svg+xml")]
  svg,
  [Description("application/x-shockwave-flash")]
  swf,
  [Description("application/x-troff")]
  t,
  [Description("application/x-tar")]
  tar,
  [Description("application/x-tcl")]
  tcl,
  [Description("application/x-tex")]
  tex,
  [Description("application/x-texinfo")]
  texi,
  [Description("application/x-texinfo")]
  texinfo,
  [Description("image/tiff")]
  tif,
  [Description("image/tiff")]
  tiff,
  [Description("application/x-troff")]
  tr,
  [Description("text/tab-separated-values")]
  tsv,
  [Description("text/plain")]
  txt,
  [Description("application/x-ustar")]
  ustar,
  [Description("application/x-cdlink")]
  vcd,
  [Description("model/vrml")]
  vrml,
  [Description("application/voicexml+xml")]
  vxml,
  [Description("audio/x-wav")]
  wav,
  [Description("image/vnd.wap.wbmp")]
  wbmp,
  [Description("application/vnd.wap.wbxml")]
  wbmxl,
  [Description("text/vnd.wap.wml")]
  wml,
  [Description("application/vnd.wap.wmlc")]
  wmlc,
  [Description("text/vnd.wap.wmlscript")]
  wmls,
  [Description("application/vnd.wap.wmlscriptc")]
  wmlsc,
  [Description("model/vrml")]
  wrl,
  [Description("image/x-xbitmap")]
  xbm,
  [Description("application/xhtml+xml")]
  xht,
  [Description("application/xhtml+xml")]
  xhtml,
  [Description("application/vnd.ms-excel")]
  xls,
  [Description("application/xml")]
  xml,
  [Description("image/x-xpixmap")]
  xpm,
  [Description("application/xml")]
  xsl,
  [Description("application/xslt+xml")]
  xslt,
  [Description("application/vnd.mozilla.xul+xml")]
  xul,
  [Description("image/x-xwindowdump")]
  xwd,
  [Description("chemical/x-xyz")]
  xyz,
  [Description("application/zip")]
  zip
}

Ответ 2

В .Net 4.5 вы можете использовать:

string contentType = MimeMapping.GetMimeMapping("someFileName.pdf")
// contentType = "application/pdf"

Подробнее

Ответ 3

IDEA: поместите данные форматов и расширений (http://www.feedforall.com/mime-types.htm) в xml или в ваш проект в качестве словаря, массива или sth else для запрос и создать процедуру определения типа mimetype для расширения.. Я думаю, что сохранение ваших данных в XML-документе будет проще для изменения после компиляции

Ответ 4

Если вы используете систему linux/unix, вы можете использовать команду file для определения типа файла.

Существует три набора тестов, выполненных в следующем порядке: тесты файловой системы, тесты магического числа и языковые тесты. Первый тест, который преуспевает, вызывает печать типа файла.

Если вы работаете на компьютере с Windows, обычно используется расширение файла, как показано в вашем коде.

Ответ 5

Загружается ли файл в приложение MVC?

public ActionResult FileUploader(HttpPostedFileBase upload)
{
  string mimeType=upload.ContentType;
}

Есть несколько предостережений с этим, хотя.

Он использует предоставленный в браузере ace 'client provided' mime type, если пользователи, загружающие элементы, не аутентифицированы или не доверяют, тогда это может быть не очень хорошая идея.

Также IE не всегда предоставляет стандартные типы Mime для определенных файлов, в частности PNG (см. В чем разница между "image/png" и "image/x- png" ?), которые могут или не могут повлиять на ваше приложение.

Мы просто используем простой оператор if для преобразования типа png mime IE (image/x-png), обратно к более распространенному (image/png).

Ответ 6

Если вы хотите использовать поток

    public class urlmonMimeDetect
    {
        [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 static string GetMimeFromFile(Stream fs)
        {

            byte[] buffer = new byte[256];
            fs.Read(buffer, 0, 256);

            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";
            }
        }
    }