我在浏览器中使用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然后保存。不要使用"附件"
提前致谢。
答案 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