2013-10-16 2 views
37

사용자에게 일부 문서를 표시하는 MVC 프로젝트가 있습니다. 파일은 현재 Azure blob 저장소에 저장되어 있습니다.파일을 다운로드하는 대신 브라우저에서 엽니 다.

현재 문서는 다음 컨트롤러 액션에서 검색 :

[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")] 
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName) 
{ 
    // get byte array from blob storage 
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName); 
    string mimeType = "application/octet-stream"; 
    return File(doc, mimeType, fileName); 
} 

을 지금 사용자가 다음과 같은 링크를 클릭 할 때 :

<a target="_blank" href="http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf 

그런 다음 파일 다운로드에 그들의 브라우저의 다운로드 폴더. 내가하고 싶은 것은 (그리고 나는 기본 동작이라고 생각했다.) 파일을 단순히 브라우저에 표시하는 것이다.

mimetype을 변경하고 반환 유형을 ActionResult 대신 FileResult로 변경해 보았습니다. 두 가지 모두 사용할 수 없습니다.

어떻게 파일을 다운로드하는 대신 브라우저에 표시 할 수 있습니까?

+3

확신 브라우저는 mimeType를 기반으로 파일을 처리하는 방법을 결정합니다. http://www.webmaster-toolkit.com/mime-types.shtml – Tommy

+0

그게 내가 의심스러워서 .pdf와 관련된 다양한 MIME 형식을 시도하고 파일을 열려고 시도했지만 매번 다운로드했다. 다른 사이트에서 다른 PDF 파일을 볼 때 브라우저 창에서 엽니 다. – Trevor

+2

내용 처리 헤더의 가치는 무엇입니까? –

답변

76

모든 해답 덕분에 해결책은 결합이었습니다. 그들 모두의 마음가짐.

첫 번째로 byte[]을 사용했기 때문에 컨트롤러 조치는 FileContentResult이 아니고 FileResult 일 필요가있었습니다. 발견 : What's the difference between the four File Results in ASP.NET MVC

두 번째로 mime 유형은 octet-stream이 아니어야합니다. 아마도 스트림을 사용하면 브라우저가 파일을 다운로드하게됩니다. 유형 application/pdf을 변경해야했습니다. 내가 다른 파일/MIME 형식을 처리하기 위해 더 강력한 솔루션을 탐험해야합니다.

셋째, content-dispositioninline으로 변경 한 헤더를 추가해야했습니다. Using this post 콘텐트 처리가 이미 attachment으로 설정되었으므로 중복 헤더를 방지하기 위해 코드를 수정해야한다는 것을 알았습니다.

성공 코드 :

public FileContentResult GetDocument(string zipCode, string loanNumber, string classification, string fileName) 
{ 
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName); 
    string mimeType = "application/pdf" 
    Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName); 
    return File(doc, mimeType); 
} 
+14

mimetype을 가져 오기위한 강력한 솔루션 :'return File (doc, MimeMapping.GetMimeMapping (fileName)); ' – Trevor

+1

해결 되었습니까? 위의 주석에 삽입 한 링크를 통해 MimeTypes의 파일 확장명을 기반으로 사전을 만들 수 있습니다. 그런 다음 파일 확장명을 사용하고 예상되는 파일에 대한 MIME 형식을 반환하는 정적 함수를 만듭니다 (예를 들어 .crt를 다루지는 않을 것입니다). 확장 기능이 없으면 표준 * 응용 프로그램/옥텟 스트림 *을 반환하십시오. – Tommy

+1

매력처럼 작동했습니다! 최고의 솔루션. – Khateeb321

3

브라우저는 MIME 유형에 따라 다운로드 또는 표시를 결정해야합니다.

이 시도 :

그것은 사람처럼 보인다
string mimeType = "application/pdf"; 
12

다른 얼마 ​​전에 비슷한 질문을했다 :

how to force pdf files to open in a browser

를 대답하면 헤더 사용해야한다는 말과 함께 :

Content-Disposition: inline; filename.pdf 
+0

그래, 불행히도 나는 이것을 시도하고 연결된 게시물의 단계를 따라야 만했지만 여전히 작동하지 않는다. 반환 형식을 FileContentResult로 변경하려고 시도했지만 도움이되지 않았습니다. – Trevor

+1

이것은 분명히 해결책의 일부였습니다. 감사합니다! – Trevor

+1

np, 다행스럽게도 – welegan

관련 문제