2011-01-02 7 views
19

입력 파일의 내용/유형을 동적으로 결정하려고합니다. 나는 Windows 응용 프로그램에있을 것입니다 경우 나는 MVC 응용 프로그램에 더 적합한 다른 어떤 방법이 (from this blog)런타임에 파일의 내용/유형을 얻는 방법

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

같은 코드를 작성할 수 있을까?

파일 경로와 contentype을받는 Controller.File(...) 메서드 내에서 param을 사용하고 싶습니다.

답변

11

중요 사항 :이 답변은 2011 년에 쓰여진, masterwok's answer 전에 몇 년이 작성되었습니다. 내 대답은 아직 허용, masterwok의 대답은 더 정확하고 간결합니다. 대신 그 대답을 사용하고 upvote하십시오. 아래는 모두 후손을위한 것입니다.

저는 파일 확장명을 사용하기 만하면 결국 엉덩이에 물지 않도록 할 수있는 영리한 작업을 시도하게됩니다. :)

파일 확장명을 시스템에 등록 할 필요가 없습니다 (파일을 사용하여 수행중인 작업을 정확히 알지 못하더라도 ...). 파일을 필터링하려면 허용되는 확장에 대한 정보가 들어있는 열거 형 또는 db 테이블과 같은 것을 사용할 수 있습니다.

자세한 내용은 @Tolgahan's idea을 참조하십시오. 나는 이것에 기초하여 사람들에게 시작점을 제공해야하는 C# enum을 아래에 만들었습니다. 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 
} 
+0

컨트롤러에서 파일을 반환하려고합니다. 정확하게 [this method] (http://msdn.microsoft.com/it-it/library/dd492492.aspx)를 사용하고 있으므로 정확히 content-type/mime-type을 사용하면 클라이언트가 올바르게 동작합니다 (예 : 렌더링 pdf, ms 단어 열기 등) – Lorenzo

+0

그러면 파일을 클라이언트에 보낼 때 올바른 'content-disposition'헤더를 전달할 수 있어야합니다. –

+0

파일 확장명을 사용하는 것은 보안이 걱정되는 경우 특히 안전하지 않습니다. – bplus

0

당신이 리눅스/유닉스 계열 시스템에 있다면 file 명령을 사용하여 파일 유형을 결정할 수 있습니다.

파일 시스템 테스트, 마법 번호 테스트 및 언어 테스트의 세 가지 테스트가이 순서대로 수행됩니다. 성공한 첫 번째 테스트는 파일 형식을 인쇄합니다.

Windows 컴퓨터를 사용하는 경우 코드에 표시된 것처럼 파일 확장명을 사용하는 것이 일반적입니다.

+0

을 웹 응용 프로그램에 내가 이러한 제품이 설치되어 해달라고 단어, 엑셀, 파워 포인트, 어도비, 등등. 그래서 레지스트리에서 사용할 수있는 키가 없다고 생각하지만 어쩌면 MIME 형식 목록에 형식을 등록해야합니다. 내가 어떻게 할 수 있니? – Lorenzo

0

파일이 MVC 응용 프로그램에 업로드되고 있습니까?

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

몇 가지주의해야 할 점이 있습니다.

사용자가 업로드 한 항목이 인증되지 않았거나 신뢰할 수 없다면 '클라이언트가 제공 한'MIME 형식을 사용하는 브라우저를 사용합니다. 그렇다면이 방법은 좋지 않을 수 있습니다.

또한 IE는 특정 파일, 특히 응용 프로그램에 영향을 줄 수도 있고하지 않을 수도있는 PNG (What is the difference between "image/png" and "image/x-png"? 참조)에 대해 표준 Mime 유형을 제공하지는 않습니다.

간단한 if 문을 사용하여 IE png MIME 유형 (image/x-png)을 더 일반적인 이미지 (png)로 변환합니다.

+0

당신이 질문에서 읽을 수 있습니다. 나는 그것을 업로드하려고하지 않고 실제로 다운로드하려고합니다. 'Controller.File (...)'메소드 호출의 컨텍스트에서 사용하고 있습니다 – Lorenzo

6

IDEA : 포맷 및 확장 데이터 (http://www.feedforall.com/mime-types.htm)를 XML 또는 프로젝트의 사전, 배열 또는 sth로 입력하고 쿼리에 대해 mimetype을 결정하는 절차를 만듭니다.난 당신이 사용할 수있는 닷넷 4.5

+0

이 모든 MIME 유형을 쓸 수있는 표준 파일이 있습니까? – Lorenzo

+4

@Lorenzo : 나는 그 파일을 XML로 변환하는 자유를 얻었다. http://pastebin.com/94ivivP4 –

+0

@ Dan Atkinson : 감사의 말. 다시 투표 할 것입니다. – Lorenzo

65

를 컴파일 한 후 수정을 위해 쉬울 것 XML 문서에 데이터를 유지 생각 :

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

More information

+3

정답으로 표시해야합니다. – JimiSweden

+2

이 질문은 asp.net이라는 태그가 붙어 있으며이 MimeMapping은 ASP.net 확장 (System.Web.MimeMapping)입니다. – mvermand

관련 문제