Chrome, pdf 디스플레이, 서버에서 수신 된 중복 헤더
웹 사이트에 라이트 박스 안에 pdf를 표시하는 섹션이 있습니다. 최근 크롬 업그레이드로 인해 다음과 같은 표시가 깨졌습니다.
오류 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION) : 여러 Content-Disposition 헤더가 수신되었습니다. 이는 HTTP 응답 분할 공격으로부터 보호하기 위해 허용되지 않습니다.
이것은 IE에서 여전히 올바르게 작동합니다.
IIS6에서 ASP.NET MVC3을 사용하고 있습니다.
파일을 생성하는 데 사용하는 코드는 다음과 같습니다.
인라인 문을 제거하면 파일이 다운로드되지만 라이트 박스 기능이 손상됩니다.
문제 코드
public FileResult PrintServices()
{
//... unrelated code removed
MemoryStream memoryStream = new MemoryStream();
pdfRenderer.PdfDocument.Save(memoryStream);
string filename = "ServicesSummary.pdf";
Response.AppendHeader("Content-Disposition", "inline;");
return File(memoryStream.ToArray(), "application/pdf", filename);
}
수정
풀다
Response.AppendHeader("Content-Disposition", "inline;");
그런 다음 변경
return File(memoryStream.ToArray(), "application/pdf", filename);
...에
return File(memoryStream.ToArray(), "application/pdf");
위의 솔루션은 파일 이름을 지정할 필요가없는 경우 괜찮지 만 사용자에 대해 지정된 파일 이름 기본값을 유지하고 싶었습니다.
우리의 솔루션은 쉼표가 포함 된 파일 이름 자체가되었습니다. 쉼표를 ""로 바꾸었고 이제 파일이 Chrome에서 예상대로 문서를 전달합니다.
FileName = FileName.Replace(",", "")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)
Response.BinaryWrite(myPDF)
@roryok의 주석을 사용하여 파일 이름을 따옴표로 묶었습니다.
Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")
@a 코더의 작은 따옴표 사용에 대한 답변이 IE에서 예상대로 작동하지 않았습니다. 이름에 여전히 작은 따옴표를 사용하여 다운로드 한 파일입니다.
오늘이 문제가 있었다. Roryok과 다른 사람들의 해결책은 파일 이름을 따옴표로 묶는 것입니다.
이전, Chrome 실패 :
header("Content-Disposition: attachment; filename=$file");
현재, Chrome OK :
header("Content-Disposition: attachment; filename='$file'");
주위의 따옴표에 유의하십시오 $file
.
동일한 문제가 발생하여 return 문에서 파일 이름을 제거하여 문제를 해결했습니다.
변화:
return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");
에:
return File(outStream.ToArray(), "application/pdf");
그리고 유지 :
Response.AddHeader("content-disposition", "attachment;filename=\"" + "Certificate.pdf" + "\"");
다운로드 한 파일의 이름은 그대로 유지됩니다.
사용자 정의 파일 이름을 가진 모든 파일 유형에 대해이 문제를 해결하려면 (또는 유사한 헤더)를 제거하십시오.
Response.AppendHeader("Content-Disposition", "inline;");
그리고 추가
string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);
you can also use the filepath instead of a stream in the first parameter
My issue was due to the double quote as shown below:
var encoding = System.Text.Encoding.UTF8;
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));*
Changing the above to this worked!
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*
'Nice programing' 카테고리의 다른 글
Rails 3.1에서 SASS (Over SCSS)를 기본값으로 사용하는 방법은 무엇입니까? (0) | 2020.12.08 |
---|---|
new EmptyResult () 반환 VS NULL 반환 (0) | 2020.12.08 |
실행중인 클래스의 파일 시스템 경로 가져 오기 (0) | 2020.12.08 |
가능한 가장 작은 유효한 PDF는 무엇입니까? (0) | 2020.12.08 |
Jackson과 매핑 할 때 기본값을 null 필드로 설정 (0) | 2020.12.08 |