Chrome、pdf 显示、从服务器接收到的重复标头
Posted
技术标签:
【中文标题】Chrome、pdf 显示、从服务器接收到的重复标头【英文标题】:Chrome, pdf display, Duplicate headers received from the server 【发布时间】:2012-01-25 04:56:20 【问题描述】:我在网站上有一个部分,我在灯箱内显示 pdf。最近的 chrome 升级打破了这个显示:
错误 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");
【问题讨论】:
相关:***.com/questions/1187261/… Returning a file to View/Download in ASP.NET MVC的可能重复 相关:***.com/a/16673120/109941 只是问一下文件名中是否有逗号,因为我只是有这个问题。如果是这样,请从文件名中删除任何逗号(如果这是一个选项)。 【参考方案1】:此解决方案将保留文件名并在浏览器中打开文件 (.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
【讨论】:
【参考方案2】:我遇到了同样的问题,并通过从 return 语句中删除文件名来解决它。
变化:
return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");
到:
return File(outStream.ToArray(), "application/pdf");
并保留:
Response.AddHeader("content-disposition", "attachment;filename=\"" + "Certificate.pdf" + "\"");
这仍然保留下载文件的名称。
【讨论】:
【参考方案3】:我的问题是由于双引号引起的,如下所示:
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)));*
【讨论】:
【参考方案4】:要为具有自定义文件名的任何文件类型修复此问题,请删除(或类似标题)
Response.AppendHeader("Content-Disposition", "inline;");
并添加
string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);
您也可以在第一个参数中使用文件路径而不是流
【讨论】:
【参考方案5】:我使用了@roryok 的评论,将文件名用引号括起来:
Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")
@a coder's answer of using single quotes 在 IE 中没有按预期工作。下载的文件名称中仍带有单引号。
【讨论】:
这个解决方案对我有用。我刚刚添加了转义的双引号,问题就自行解决了。谢谢! 嘿,我试过了,但是下载时文件名带有下划线前缀和后缀。 (Content-Disposition: attachment; filename="ab,cd.pptx") 实际名称 -> ab,cd.pptx... NameOnDownload -> ab,cd.pptx ... 我能做什么为这个问题做些什么?【参考方案6】:今天遇到了这个问题。根据 roryok 和其他人,解决方案是将文件名放在引号中。
以前,Chrome 失败:
header("Content-Disposition: attachment; filename=$file");
当前,Chrome OK:
header("Content-Disposition: attachment; filename='$file'");
注意$file
周围的引号。
【讨论】:
对我来说,在 IE 中,单引号导致文件下载时文件名周围带有单引号:'Blah, Inc. 847.pdf'【参考方案7】:如果您不需要指定文件名,上述解决方案很好,但我们希望保留为用户指定的文件名默认值。
我们的解决方案最终是文件名本身,因为它包含一些逗号。我用“”替换了逗号,现在文件按预期在 Chrome 中提供了文档。
FileName = FileName.Replace(",", "")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)
Response.BinaryWrite(myPDF)
【讨论】:
您还可以在文件名周围添加逗号。 DocRaptor 和 phpheader()
的相同问题和解决方案。谢谢。
这里有同样的问题,但只能通过将文件名放在引号中来解决:Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")
@Nik 你应该用引号解决方案发布一个答案,因为它与这个完全不同并且效果很好。我会赞成这个答案。
今天遇到了 Azure Blob 存储和 Content-Disposition 标头的问题。感谢您的修复 - 效果很好!以上是关于Chrome、pdf 显示、从服务器接收到的重复标头的主要内容,如果未能解决你的问题,请参考以下文章
Mpdf 不从内联 chrome 浏览器下载 pdf(但显示 pdf)
从接收到的 NFC 数据向 iOS 应用程序传递数据 [重复]