2010-01-05 10 views
5

La mia applicazione ASP.NET MVC ha pagine con allegati e questi allegati possono essere di diversi tipi di file.Come si restituisce un FileResult in ASP.NET senza conoscere il tipo MIME?

Quando l'utente desidera accedere al proprio allegato, è necessario attivare un FileResult e restituire l'allegato del file su cui ho il percorso.

Tuttavia, non ho database di tipi mime, né conosco il mime-type di questi file a mano.

Qual è il modo corretto di gestirlo? C'è un modo in cui posso restituire un file e lasciare che il framework cerchi di capire il mimetype?

Qualche suggerimento?

risposta

9

Il modo in cui l'ho fatto è tenere un elenco di estensioni note e i loro tipi di mime e, se l'estensione non viene trovata, è sufficiente restituirla come application/octet-stream. Il motivo è che questo tipo di mime viene applicato alle applicazioni (ad esempio, exe) che il browser, in base alle impostazioni di sicurezza, può consentire di passare al sistema operativo, aprendo in tal modo l'editor predefinito per quel tipo di file. A proposito, considera le implicazioni di sicurezza per ogni tipo di file che puoi accettare e trasferire agli utenti.

Ecco la lista Io generalmente uso:

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

Ecco un esempio di come usare questo (C# -come pseudocodice).

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, puoi mostrare un pezzo di codice nel controller che attraversa questa lista e tira il mime-type appropriato? Grazie mille per la tua risposta! – Godel

+0

Mi dispiace, non posso. Sono tutte informazioni pubbliche (l'ho estratto da wikipedia e da altre fonti) ma il codice che ho usato per attraversarlo non è open source. Inoltre, la sua roba di configurazione 2.0, che è piuttosto pesante. Ti darò un esempio di come farlo, comunque. – Will

+0

@Will Grazie per questa soluzione. La tua risposta ha quasi 2 anni. È ancora la tua soluzione preferita? – gsharp

Problemi correlati