ASP.NET MVC의 4 가지 파일 결과의 차이점


136

ASP.NET에는 네 가지 유형의 파일 결과가 있습니다.

  • FileContentResult : 이진 파일의 내용을 응답으로 보냅니다.
  • FilePathResult : 파일의 내용을 응답으로 보냅니다.
  • FileResult : 응답에 쓸 이진 출력을 반환합니다.
  • FileStreamResult : Stream 인스턴스를 사용하여 이진 콘텐츠를 응답으로 보냅니다.

이러한 설명은 MSDN에서 가져 왔으며 FileStreamResult를 제외하고 처음 세 개의 사운드는 동일합니다. 그렇다면 차이점은 무엇입니까?

답변:


176

FileResult 다른 모든 사람들을위한 추상 기본 클래스입니다.

  • FileContentResult -파일로 반환하려는 바이트 배열이있을 때 사용합니다.
  • FilePathResult -디스크에 파일이 있고 그 내용을 반환하고 싶을 때 (경로 제공)
  • FileStreamResult -스트림이 열려 있고 내용을 파일로 반환하려고합니다.

그러나 이러한 클래스를 거의 사용하지 않아도됩니다. Controller.File오버로드 중 하나만 사용하면 ASP.NET MVC가 마법을 발휘할 수 있습니다.


29

좋은 질문입니다 ... 자세한 내용이 필요합니다. 흥미로운 상황의 결과로 여기에서 나 자신을 찾습니다. MVC3 / C # 환경을 통해 일부 PDF 첨부 파일을 제공했습니다. 코드가 출시되었고 Chrome을 사용할 때 다운로드가 이상하게 작동하고 파일 형식이 'pdf-, attachment.pdf-, attachment'로 변환되었다는 고객의 응답을 받기 시작했습니다. 그렇습니다 ... 당신은 모든 것을 얻었습니다. 따라서 파일을 'pdf'로 다시 작성할 수 있으며 파일은 그대로 저장되지만 엉망입니다!

따라서 초기 상황을 설명하기 위해 'Content-Disposition'헤더를 설정 한 다음 FileContentResult를 반환했습니다.

var cd = new System.Net.Mime.ContentDisposition
            {
                FileName = result.Attachment.FileName,
                Inline = false
            };
            Response.AppendHeader("Content-Disposition", cd.ToString());

return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);

좋아 보였다. IE에서 잘 작동했습니다. 그래서 약간의 연구를 수행하고 대신 FileStreamResult를 구현하려고 시도했습니다 (Content-Disposition setter 유지).

MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));

Chrome에서 문제가 해결되었습니다. 흠 ...하지만 왜 완벽하게 좋은 바이트 배열을 가져 와서 스트림 한 다음 이것을 통해 반환해야 파일 이름이 올바르게 작동합니까?

그리고 피들러가왔다.

FileContentResult를 사용하면 헤더에 2 개의 Content-Dispositions가 있습니다. FileStreamResult를 사용하면 1을 얻습니다.

FileContentResult는 파일 이름을 제공 할 때 Content-Disposition 헤더를 추가하고 Chrome은이 헤더의 배수를 오류로 간주합니다.

홀수 반응 ...하지만 확실히 알고있는 것.


3
팁 : .NET 4 이상 System.Web.MimeMapping.GetMimeMapping(filename)에서는 쉽게 액세스 할 수없는 경우 MIME 유형을 수집하는 데 사용할 수 있습니다.
GONeale

4
File결과에 파일 이름을 제공 한다는 것은 FileDownloadName속성을 설정하는 것을 의미 하며 Content-Disposition헤더를 설정합니다 . 그리고 ContentDisposition클래스를 돕는 클래스 가 아닌 utf-8 파일 이름을 올바르게 지원합니다 ( 자세한 내용은 여기 내 의견 참조).
Frédéric

1
예, @ Frédéric에게 감사합니다. 모든 SO 게시물 중 혼자서 무슨 일이 있었는지 설명했습니다!
Nacht
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.