2011-01-02 40 views
19

Tôi đang cố gắng xác định động nội dung/loại tệp đầu vào. Nếu tôi ở trong một ứng dụng cửa sổ, tôi có thể viết mã như thế này (from this blog)Cách lấy nội dung/loại tệp tại thời gian chạy

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

Phương pháp nào khác phù hợp hơn với ứng dụng MVC?

Tôi muốn sử dụng thông số trong phương thức Controller.File(...) nhận tệp và loại nội dung.

Trả lời

11

Lưu ý quan trọng: Câu trả lời này được viết vào năm 2011, một vài năm trước khi masterwok's answer được viết. Trong khi câu trả lời của tôi vẫn là chấp nhận được, câu trả lời của masterwok là tốt hơn và ngắn gọn hơn. Thay vào đó hãy sử dụng và upvote câu trả lời đó. Mọi thứ dưới đây là dành cho hậu thế.

Tôi chỉ sử dụng phần mở rộng tệp thay vì cố gắng làm điều gì đó thông minh mà cuối cùng có thể quay trở lại để cắn bạn trong mông. :)

Phần mở rộng tệp không cần phải được đăng ký trên hệ thống của bạn (mặc dù tôi không biết chính xác bạn đang làm gì với tệp ...). Bạn có thể sử dụng một cái gì đó như một bảng enum hoặc db có chứa thông tin về các phần mở rộng chấp nhận được nếu bạn muốn lọc ra các tập tin.

Vui lòng xem @Tolgahan's idea về điều này. Tôi tạo ra một C# enum dưới đây dựa trên điều này mà nên cung cấp cho người dân với một điểm khởi đầu nếu họ muốn tạo ra một phương pháp tiếp cận db/enum/xml dựa trên này.

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

Tôi đang cố gắng trả về một tập tin từ bộ điều khiển. Tôi đang sử dụng chính xác [phương pháp này] (http://msdn.microsoft.com/it-it/library/dd492492.aspx) để sử dụng kiểu nội dung chính xác/loại mime làm cho ứng dụng khách hoạt động chính xác (như hiển thị pdf, mở ms word, v.v.) – Lorenzo

+0

Sau đó, chắc chắn bạn chỉ cần đảm bảo rằng bạn chuyển đúng tiêu đề 'content-disposition' khi gửi tệp cho máy khách. –

+0

Chỉ cần sử dụng phần mở rộng tập tin không phải là đặc biệt an toàn nếu bạn lo lắng về bảo mật. – bplus

0

Nếu bạn đang sử dụng hệ thống linux/unix giống như bạn có thể sử dụng lệnh file để xác định loại tệp.

Có ba bộ kiểm tra, được thực hiện theo thứ tự sau: kiểm tra hệ thống tệp, kiểm tra số phép thuật và kiểm tra ngôn ngữ. Thử nghiệm đầu tiên thành công làm cho loại tệp được in.

Nếu bạn đang sử dụng máy Windows, việc sử dụng đuôi tệp như bạn đã hiển thị trong mã của bạn là điều phổ biến.

+0

Mở một ứng dụng web tôi không có bất kỳ các sản phẩm này được cài đặt trên máy chủ: word, excel, powerpoint, adobe, vv vì vậy tôi cho rằng không có khóa nào có sẵn trong sổ đăng ký nhưng có lẽ tôi phải đăng ký các loại trong danh sách loại mime. Làm thế nào tôi có thể làm gì? – Lorenzo

0

Tệp có đang được tải lên ứng dụng MVC không?

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

Có một vài điều cần lưu ý với điều này.

Ứng dụng này sử dụng trình duyệt được cung cấp loại mime được khách hàng cung cấp, nếu người dùng tải lên các mục không được xác thực hoặc tin cậy thì điều này có thể không phải là một ý tưởng hay.

Ngoài ra, IE không phải lúc nào cũng cung cấp các loại Mime tiêu chuẩn cho một số tệp nhất định, cụ thể là PNG (xem What is the difference between "image/png" and "image/x-png"?) có thể có hoặc không ảnh hưởng đến ứng dụng của bạn.

Chúng tôi chỉ sử dụng câu lệnh if đơn giản để chuyển đổi loại mime IE png (hình ảnh/x-png), trở lại hình ảnh phổ biến hơn (hình/png).

+0

như bạn có thể đọc từ câu hỏi tôi đang cố gắng sử dụng nó không phải để tải lên nhưng để tải xuống thực sự. Tôi đang sử dụng nó trong ngữ cảnh của phương thức 'Controller.File (...)' gọi – Lorenzo

6

IDEA: đặt dữ liệu định dạng và tiện ích (http://www.feedforall.com/mime-types.htm) vào xml hoặc vào dự án của bạn dưới dạng từ điển, mảng hoặc sth khác cho truy vấn và tạo quy trình xác định mimetype cho tiện ích mở rộng ..tôi nghĩ rằng việc giữ dữ liệu của bạn trên tài liệu xml sẽ dễ dàng hơn cho sửa đổi sau khi biên dịch

+0

Có tập tin chuẩn nào để tôi có thể viết tất cả các loại mime này không? – Lorenzo

+4

@Lorenzo: Tôi đã tự do dịch tệp đó thành XML - http://pastebin.com/94ivivP4 –

+0

@Dan Atkinson: Rất nhiều cảm ơn. sẽ bỏ phiếu một lần nữa :) – Lorenzo

65

Trong Net 4.5, bạn có thể sử dụng:

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

More information

+3

điều này sẽ được đánh dấu là câu trả lời đúng. – JimiSweden

+2

Hãy lưu ý rằng câu hỏi này được gắn thẻ asp.net và rằng MimeMapping này là một phần mở rộng ASP.net (System.Web.MimeMapping) – mvermand

Các vấn đề liên quan