IE中的Content-Disposition内联文件名问题

时间:2016-03-23 12:13:14

标签: response-headers

我在浏览器中使用aspx页面在API中显示pdf。

使用Chrome / Firefox保存pdf时,请采用来自ACTION_IMAGE_CAPTURE

的文件名

但是在使用IE保存pdf时,它不会从header("Content-Disposition", "inline;filename=xyz.pdf")读取文件名。
相反,它采用aspx名称。

技术细节

我有一个xyz.aspx页面。 xyz.aspx页面将调用文档的API。 然后,来自API的下载文档将转移到带内联的浏览器以显示pdf文档。 我将响应头设置如下并写入文件字节。

header("Content-Disposition", "inline;filename=xyz.pdf")
  • 问题:

    在IE中保存已打开的pdf时,需要xyz.aspx而不是标题中的名称。

  • 要求:

    使用IE保存pdf时,需要使用pdf名称保存。

我搜索了这么多,因为每个人都告诉它的IE行为。我希望有人知道解决方案。

注意:我必须在浏览器中显示pdf然后保存。不要使用"附件"

提前致谢。

2 个答案:

答案 0 :(得分:6)

某些版本的IE无法处理("Content-Disposition", "inline;filename=...")

这是因为filename=...最初用于附件处置。并非所有基于浏览器的PDF查看器都可以处理它。

我看到的唯一解决方案是允许通过其他网址进行访问。 假设您有一条指向pdf的路线,如:/pdf/view。如果您将其更改为/pdf/view/filename,并将应用程序配置为以与/pdf/view相同的方式处理此路由,则问题将得到解决。

您还可以在网络服务器上重写下载网址。 根据您的网络服务器,您可以通过各种方式执行此操作。

答案 1 :(得分:1)

我也试过各种标题和方法。

最后,我的解决方案是

    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("api/getpdfticket/{ticketnumber}")]        
    public async Task<FileResult> GetPdfTicket(string ticketnumber)

和href: HREF =&#34; @($&#34; / API / getpdfticket / {product.TicketNumber} .PDF&#34)&#34;

似乎Microsloft仍在发明自己的标准: http://test.greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf

PDF Handler : content-disposition filename