2010-01-05 8 views
5

Meine ASP.NET MVC-Anwendung hat Seiten mit Anhängen, und diese Anhänge können viele verschiedene Dateitypen enthalten.Wie gebe ich ein FileResult in ASP.NET zurück, ohne den MIME-Typ zu kennen?

Wenn der Benutzer dann auf ihren Anhang zugreifen möchte, muss ich ein FileResult auslösen und den Dateianhang zurückgeben, zu dem ich den Pfad habe.

Allerdings habe ich keine Datenbank von Mime-Typen, noch kenne ich die MIME-Art dieser Dateien aus der Hand.

Was ist der richtige Weg, damit umzugehen? Gibt es eine Möglichkeit, eine Datei zurückgeben und das Framework versuchen, den MIME-Typ herauszufinden?

Irgendwelche Vorschläge?

Antwort

9

Die Art, wie ich es getan habe, ist eine Liste von bekannten Erweiterungen und deren MIME-Typen zu führen, und wenn die Erweiterung nicht gefunden wird, dann geben Sie sie einfach als application/octet-stream zurück. Der Grund dafür ist, dass dieser MIME-Typ auf Anwendungen (z. B. EXE) angewendet wird, die der Browser je nach Sicherheitseinstellungen möglicherweise an das Betriebssystem weitergeben kann, wodurch der Standardeditor für diesen Dateityp geöffnet wird. Bedenken Sie außerdem die Auswirkungen auf die Sicherheit für jede Art von Datei, die Sie akzeptieren und an Benutzer übertragen können.

Hier ist die Liste, die ich verwende in der Regel:

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

Hier ist ein Beispiel dafür, wie diese (C# -ähnliche Pseudo-Code) zu verwenden.

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

@Will, können Sie zeigen, Stück des Codes in der Steuerung, die diese Liste durchläuft und zieht die entsprechende Mime-Typ? Vielen Dank für Ihre Antwort! – Godel

+0

Sorry, kann nicht. Dies ist alles öffentliche Information (ich habe es aus Wikipedia und anderen Quellen herausgeholt), aber der Code, den ich benutzt habe, ist nicht Open Source. Nebenbei, seine 2.0 Konfiguration Zeug, das ziemlich schwer ist. Ich gebe Ihnen jedoch eine Probe, wie es geht. – Will

+0

@Will Danke für diese Lösung. Ihre Antwort ist fast 2 Jahre alt. Ist es immer noch Ihre bevorzugte Lösung? – gsharp