답변:
좋은 질문입니다 ... 자세한 내용이 필요합니다. 흥미로운 상황의 결과로 여기에서 나 자신을 찾습니다. 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은이 헤더의 배수를 오류로 간주합니다.
홀수 반응 ...하지만 확실히 알고있는 것.
File
결과에 파일 이름을 제공 한다는 것은 FileDownloadName
속성을 설정하는 것을 의미 하며 Content-Disposition
헤더를 설정합니다 . 그리고 ContentDisposition
클래스를 돕는 클래스 가 아닌 utf-8 파일 이름을 올바르게 지원합니다 ( 자세한 내용은 여기 내 의견 참조).
System.Web.MimeMapping.GetMimeMapping(filename)
에서는 쉽게 액세스 할 수없는 경우 MIME 유형을 수집하는 데 사용할 수 있습니다.