2010-01-05 79 views
5

我的ASP.NET MVC應用程序具有帶附件的頁面,這些附件可以具有許多不同的文件類型。如何在不知道MIME類型的情況下在ASP.NET中返回FileResult?

當用戶想要訪問他們的附件時,我需要啓動FileResult並返回我有路徑的文件附件。

但是,我沒有mime類型的數據庫,也沒有親手知道這些文件的mime類型。

處理這個問題的正確方法是什麼?有沒有辦法我可以返回一個文件,讓框架試圖找出mimetype?

有什麼建議嗎?

回答

9

我這樣做的方式是保留知名擴展名及其MIME類型的列表,並且如果未找到擴展名,則將其作爲application/octet-stream返回。原因是這種MIME類型被應用於瀏覽器(取決於安全設置)可能允許您傳遞到操作系統的應用程序(例如exe),從而打開該文件類型的默認編輯器。順便說一句,考慮您可能接受並傳輸給用戶的每種文件的安全含義。

這裏的名單我一般用:

<MimeTypes> 
    <MimeType Type="application/mac-binhex40" Extensions=".hqx"/> 
    <MimeType Type="application/msword" Extensions=".doc;.docx"/> 
    <MimeType Type="application/pdf" Extensions=".pdf"/> 
    <MimeType Type="application/postscript" Extensions=".ai;.eps;.ps"/> 
    <MimeType Type="application/rtf" Extensions=".rtf"/> 
    <MimeType Type="application/vnd.ms-excel" 
      Extensions=".xla;.xlc;.xlm;.xls;.xlt;.xlw;.xlsx"/> 
    <MimeType Type="application/vnd.ms-outlook" Extensions=".msg"/> 
    <MimeType Type="application/vnd.ms-powerpoint" 
      Extensions=".pot;.pps;.ppt;.pptx"/> 
    <MimeType Type="application/vnd.ms-works" Extensions=".wcm;.wdb;.wks;.wps"/> 
    <MimeType Type="application/x-compress" Extensions=".z"/> 
    <MimeType Type="application/x-compressed" Extensions=".tgz"/> 
    <MimeType Type="application/x-gzip" Extensions=".gz"/> 
    <MimeType Type="application/x-msaccess" Extensions=".mdb"/> 
    <MimeType Type="application/x-msmetafile" Extensions=".wmf"/> 
    <MimeType Type="application/x-mspublisher" Extensions=".pub"/> 
    <MimeType Type="application/x-msschedule" Extensions=".scd"/> 
    <MimeType Type="application/x-msterminal" Extensions=".trm"/> 
    <MimeType Type="application/x-mswrite" Extensions=".wri"/> 
    <MimeType Type="application/x-tar" Extensions=".tar"/> 
    <MimeType Type="application/zip" Extensions=".zip"/> 
    <MimeType Type="audio/basic" Extensions=".au;.snd"/> 
    <MimeType Type="audio/mid" Extensions=".mid;.rmi"/> 
    <MimeType Type="audio/mpeg" Extensions=".mp3"/> 
    <MimeType Type="audio/x-aiff" Extensions=".aif;.aifc;.aiff"/> 
    <MimeType Type="audio/x-pn-realaudio" Extensions=".ra;.ram"/> 
    <MimeType Type="audio/x-wav" Extensions=".wav"/> 
    <MimeType Type="image/bmp" Extensions=".bmp"/> 
    <MimeType Type="image/gif" Extensions=".gif"/> 
    <MimeType Type="image/jpeg" Extensions=".jpe;.jpeg;.jpg"/> 
    <MimeType Type="image/pipeg" Extensions=".jfif"/> 
    <MimeType Type="image/tiff" Extensions=".tif;.tiff"/> 
    <!--Substitute the following two for text/plain if you're sure bad html 
    won't get rendered in the browser--> 
    <!--<MimeType Type="text/html" Extensions=".mht;.html;.htm"/>--> 
    <!--<MimeType Type="text/plain" Extensions=".txt"/>--> 
    <MimeType Type="text/plain" Extensions=".txt;.html;.htm"/> 
    <MimeType Type="text/richtext" Extensions=".rtx"/> 
    <MimeType Type="text/tab-separated-values" Extensions=".tsv"/> 
    <MimeType Type="video/mpeg" Extensions=".mp2;.mpa;.mpe;.mpeg;.mpg;.mpv2"/> 
    <MimeType Type="video/quicktime" Extensions=".mov;.qt"/> 
    <MimeType Type="video/x-la-asf" Extensions=".lsf;.lsx;.asf;.asr;.asx;"/> 
    <MimeType Type="video/x-msvideo" Extensions=".avi"/> 
    </MimeTypes> 

這裏有一個如何使用這個(類似C#的僞代碼)的例子。

public string GetMimeType(string ext) 
{ 
    // who would load the file on every method call? That's just dumb 
    var mimes = XElement.Load("MyMimeTypesLolKThx.xml"); 
    var result = from x in mimes.Elements() 
       where Contains(x, ext) 
       select x.Attribute("Type"); 
    return result.FirstOrDefault() ?? "application/octet-stream"; 
} 

public bool Contains(XElement el, string ext) 
{ 
    return el.Attribute("Extensions").Value.Contains(ext); 
} 
+0

@你能告訴你一段代碼在控制器中遍歷這個列表並且拉取合適的mime類型嗎?非常感謝您的回答! – Godel 2010-01-05 18:45:45

+0

對不起,不行。這是所有的公開信息(我從維基百科和其他來源剔除它),但我用來遍歷它的代碼不是開源的。此外,它的2.0配置的東西,這是相當重的。但是,我會給你一個如何做的例子。 – Will 2010-01-05 18:52:47

+0

@願意感謝這個解決方案。您的答案已近2年。它仍然是您首選的解決方案? – gsharp 2011-12-23 08:59:14

相關問題