IE 的 Content-Disposition 内联文件名问题
Posted
技术标签:
【中文标题】IE 的 Content-Disposition 内联文件名问题【英文标题】:Content-Disposition inline filename issue with IE 【发布时间】:2016-03-23 12:13:14 【问题描述】:我正在使用 aspx 页面从 API 内联的浏览器中显示 pdf。
使用 Chrome/Firefox 保存 pdf 时,从 header("Content-Disposition", "inline;filename=xyz.pdf")
但在使用 IE 保存 pdf 时,它不会从 header("Content-Disposition", "inline;filename=xyz.pdf")
读取文件名。 取而代之的是 aspx 名称。
技术细节
我有一个 xyz.aspx 页面。 xyz.aspx 页面将为文档调用 API。 然后从 API 下载的文档将通过内联传输到浏览器以显示 pdf 文档。 我将响应头设置如下并写入文件字节。
HttpContext.Current.Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "inline;filename=\"" + Name + "\"");
HttpContext.Current.Response.ContentType = "application/pdf";
问题:
在 IE 中保存打开的 pdf 时,它需要 xyz.aspx 而不是标题中的名称。
要求:
使用IE保存pdf时,需要以pdf的名称保存。
我搜索了很多,因为每个人都告诉它的 IE 行为。我希望有人知道解决方案。
注意:我必须在浏览器中显示 pdf 然后保存。不要使用“附件”下载
【问题讨论】:
【参考方案1】:确实有些版本的IE不能处理("Content-Disposition", "inline;filename=...")
这是因为filename=...
最初用于附件处置。并非所有基于浏览器的 PDF 查看器都能处理。
我看到的唯一解决方案是允许通过不同的网址进行访问。
假设您有一条到 pdf 的路径,例如:/pdf/view
。如果您将其更改为/pdf/view/filename
并配置您的应用程序以与/pdf/view
相同的方式处理此路由,您的问题就解决了。
您也可以在网络服务器上重新编写下载 url。 根据您的网络服务器,您有多种方法可以做到这一点。
【讨论】:
【参考方案2】:我也尝试过各种标头和方法。
最后,我的解决方案是
private FileResult ReturnStreamAsPdf(string fileName, Stream stream)
ContentDisposition cd = new ContentDisposition
FileName = fileName,
Inline = true // false = prompt the user for downloading; true = browser to try to show the file inline
;
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("X-Content-Type-Options", "nosniff");
return new FileStreamResult(stream, MediaTypeNames.Application.Pdf);
以及方法上的Route属性:
[Route("api/getpdfticket/ticketnumber")]
public async Task<FileResult> GetPdfTicket(string ticketnumber)
还有href: href="@($"/api/getpdfticket/product.TicketNumber.pdf")"
Microsloft 似乎仍在发明自己的标准: http://test.greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf
PDF Handler : content-disposition filename
【讨论】:
这行得通,添加response.setHeader("X-Content-Type-Options", "nosniff");
对我有用。谢谢。以上是关于IE 的 Content-Disposition 内联文件名问题的主要内容,如果未能解决你的问题,请参考以下文章
Content-Disposition标头中的Unicode
HTTP协议header中Content-Disposition中文文件名乱码
解决response.AddHeader("Content-Disposition", "attachment; fileName=" + fileNam(示例