我在网站上有一个部分,我在灯箱内显示pdf。最近的Chrome升级打破了这一点:
错误349(net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): 收到多个Content-Disposition标头。这是不允许的 防止HTTP响应分裂攻击。
这在IE中仍然可以正常工作。
我在IIS6上使用ASP.NET MVC
我用来生成文件的代码如下。
如果删除内联语句,则文件会下载,但会破坏灯箱功能。
问题代码
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");
答案 0 :(得分:69)
如果您不需要指定文件名,上面的解决方案就可以了,但我们希望保留为用户指定的默认文件名。
我们的解决方案最终成为文件名本身,因为它包含一些逗号。我用逗号替换了逗号,现在该文件按照预期在Chrome中提供了文档。
FileName = FileName.Replace(",", "")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)
Response.BinaryWrite(myPDF)
答案 1 :(得分:20)
我使用了@ roryok的评论,用引号括起文件名:
Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")
@c编码器使用单引号的答案在IE中无法正常工作。使用单引号下载的文件仍在名称中。
答案 2 :(得分:2)
今天有这个问题。根据roryok和其他人的说法,解决方法是将文件名放在引号中。
上一篇,Chrome失败:
header("Content-Disposition: attachment; filename=$file");
当前,Chrome确定:
header("Content-Disposition: attachment; filename='$file'");
请注意$file
周围的引号。
答案 3 :(得分:1)
我遇到了同样的问题并通过从return语句中删除文件名来修复它。
变化:
return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");
为:
return File(outStream.ToArray(), "application/pdf");
和KEPT:
Response.AddHeader("content-disposition", "attachment;filename=\"" + "Certificate.pdf" + "\"");
这仍保留下载文件的名称。
答案 4 :(得分:0)
我的问题是由于双引号如下所示:
var encoding = System.Text.Encoding.UTF8;
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));*
将上述更改为此工作!
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*
答案 5 :(得分:0)
为具有自定义文件名的任何文件类型修复此问题,删除(或类似标题)
Response.AppendHeader("Content-Disposition", "inline;");
并添加
string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);
您也可以在第一个参数
中使用文件路径而不是流答案 6 :(得分:0)
此解决方案将保留文件名并在浏览器(.net mvc)中打开文件
Response.Headers["Content-Disposition"] = "inline;filename=\"" + theFile.filename + "\"";
return File(filePath, mimeType);//don't specify filename. It will create second Content-Disposition header