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(示例

Content-Type: application/vnd.ms-excel

下载文件时,ie中文名乱码

删除保存文件对话框中的“打开”按钮(仅限 IE)