2011-01-02 19 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; 
} 

のようなコードを書くことができますか?

ファイルパスとコンテンツタイプを受け取るController.File(...)メソッド内のparamを使用したいと思います。

答えて

11

重要な注意:この回答はmasterwok's answerが書かれていた数年前、2011年に書かれていました。私の答えはまだで受け付けますが、の場合、masterwokの答えはより良く、より簡潔です。代わりに、その答えを使用してupvoteします。下のすべてが後世のものです。

私はファイル拡張子を使用して、最終的にはお尻であなたを噛んで戻ってくるかもしれない何かを巧妙にしようとするよりも、 :)

あなたのシステムにファイル拡張子を登録する必要はありませんが(ファイルで何をやっているのかはわかりませんが...)。ファイルをフィルタリングする場合は、許容可能な拡張子に関する情報を含むenumまたは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

Linux/UNIX系のシステムの場合は、fileコマンドを使用してファイルの種類を判断できます。

ファイルシステムテスト、マジックナンバーテスト、言語テストの3つのテストがこの順序で実行されます。成功した最初のテストでは、ファイルの種類が印刷されます。

Windowsマシンの場合は、コードに表示されているようにファイル拡張子を使用するのが一般的です。

+0

をWebアプリケーションでは、私はこれらの製品のいずれかがインストールされて持っていけませんワード、エクセル、パワーポイント、アドビなどのように、私はレジストリにキーがないと仮定しますが、MIMEタイプリストにタイプを登録しなければならないかもしれません。私はどうすればいいですか? – Lorenzo

0

ファイルはMVCアプリケーションにアップロードされていますか?

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

これにはいくつかの注意点があります。

ユーザーがアップロードしたアイテムが認証されていない、または信頼されていない場合は、「クライアント提供の」MIMEタイプを提供するブラウザを使用します。これは良い考えではありません。

また、特定のファイル、特にあなたのアプリケーションに影響を与えるかもしれないPNG(標準ではWhat is the difference between "image/png" and "image/x-png"?を参照)のために、標準的なMIMEタイプを提供するわけではありません。

単純なif文を使用して、IE png MIMEタイプ(image/x-png)をより一般的なもの(image/png)に変換します。

+0

あなたが質問から読むことができるので、私はアップロードのためではなくダウンロードのためにそれを使用しようとしています。私は 'Controller.File(...)'メソッド呼び出しの文脈でそれを使用しています – Lorenzo

6

IDEA:書式と拡張子のデータ(http://www.feedforall.com/mime-types.htm)をxmlに、またはプロジェクトの辞書、配列、sth elseに入れてクエリ用にmimetypeを決定するプロシージャを作成します。私はあなたが使用することができます。ネット4.5で

+0

これらのMIMEタイプをすべて記述できる標準ファイルはありますか? – Lorenzo

+4

@Lorenzo:私はそのファイルをXMLに翻訳する自由を取った - http://pastebin.com/94ivivP4 –

+0

@ダン・アトキンソン:ありがとうございました。もう一度投票するでしょう:) – 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

関連する問題