2010-01-05 3 views
5

내 ASP.NET MVC 응용 프로그램에는 첨부 파일이있는 페이지가 있으며 이러한 첨부 파일은 다양한 파일 형식이 될 수 있습니다.MIME 형식을 모른 채 ASP.NET에서 FileResult를 반환하려면 어떻게해야합니까?

사용자가 첨부 파일에 액세스하려고 할 때 FileResult를 실행하고 경로가있는 첨부 파일을 반환해야합니다.

그러나 저는 MIME 형식의 데이터베이스가 없으며 이러한 파일의 MIME 형식을 손에서 떼어 놓을 수 없습니다.

이 문제를 해결하는 적절한 방법은 무엇입니까? 파일을 반환하고 프레임 워크에서 MIME 형식을 파악할 수있는 방법이 있습니까?

제안 사항?

답변

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> 

여기이 (의사 -like 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

@Will,이 목록을 탐색하고 적절한 MIME 유형을 가져 오는 컨트롤러에 코드 조각을 표시 할 수 있습니까? 답변 해 주셔서 대단히 감사합니다! – Godel

+0

죄송합니다. 이것은 공개 된 모든 정보입니다 (위키피디아와 다른 출처에서 추려 냈습니다). 그러나 그것을 통과하는 데 사용 된 코드는 오픈 소스가 아닙니다. 게다가, 그것의 2.0 구성 물건, 꽤 무거운 무게입니다. 그러나 나는 당신에게 그것을하는 방법의 견본을 줄 것이다. – Will

+0

@Will이 솔루션을 이용해 주셔서 감사합니다. 귀하의 답변은 거의 2 세입니다. 아직도 당신이 선호하는 해결책입니까? – gsharp

관련 문제