2010-01-05 21 views
5

Mi aplicación ASP.NET MVC tiene páginas con archivos adjuntos y estos archivos adjuntos pueden ser de diferentes tipos de archivos.¿Cómo devuelvo FileResult en ASP.NET sin conocer el tipo MIME?

Cuando el usuario quiere acceder a sus archivos adjuntos, necesito iniciar FileResult y devolver el archivo adjunto al que tengo la ruta de acceso.

Sin embargo, no tengo una base de datos de mime-types, ni sé de ante mano el tipo mime de estos archivos.

¿Cuál es la forma correcta de manejar esto? ¿Hay alguna manera de que pueda devolver un archivo y dejar que el marco intente descubrir el tipo mimet?

¿Alguna sugerencia?

Respuesta

9

La forma en que lo hice es manteniendo una lista de extensiones bien conocidas y sus tipos de mime, y si no se encuentra la extensión, simplemente devuelva como application/octet-stream. La razón de esto es que este tipo de mimo se aplica a las aplicaciones (por ejemplo, exe) que el navegador, dependiendo de la configuración de seguridad, puede permitirle pasar al sistema operativo, abriendo así el editor predeterminado para ese tipo de archivo. Por cierto, considere las implicaciones de seguridad para cada tipo de archivo que pueda aceptar y transferir a los usuarios.

Aquí está la lista general que utilizo:

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

Aquí hay un ejemplo de cómo utilizar este (C# -como pseudocódigo).

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, ¿puede mostrar un fragmento de código en el controlador que atraviesa esta lista y saca el tipo de mime apropiado? ¡Muchísimas gracias por su respuesta! – Godel

+0

Lo siento, no puedo. Esta es toda la información pública (la seleccioné de wikipedia y otras fuentes) pero el código que utilicé para atravesarlo no es de código abierto. Además, su configuración 2.0 es bastante pesada. Sin embargo, te daré una muestra de cómo hacerlo. – Will

+0

@Will Gracias por esta solución. Su respuesta tiene casi 2 años. ¿Sigue siendo tu solución preferida? – gsharp

Cuestiones relacionadas