我正在尝试编写MVC端点,它可以选择性地将内容处理设置为内联或附件,以便在新的浏览器选项卡中显示文件(pdf(或下载文件。UI允许用户选择打开文件的方式(而不是我的设计-无法更改文件的这一方面(。
请注意,这在Chrome/Edge中可以正常工作。
在Firefox中,PDF的应用程序设置似乎胜过内容处理。有没有可靠的方法让Firefox尊重内容处理?最好是一种可以在普通安装浏览器的情况下工作的方式,这样最终用户就不需要对其进行任何修改。
以下是我用来设置响应的代码(类源自ApiController(:
var response = Request.CreateResponse(System.Net.HttpStatusCode.OK);
response.Content = new PushStreamContent((stream, content, context) =>
{
dispatcher.Dispatch(request, stream);
}, new MediaTypeHeaderValue(MediaTypeNames.Application.Pdf));
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(contentDisposition)
{
FileName = $"{auto_generated_fileName}.pdf",
};
response.Headers.CacheControl = new CacheControlHeaderValue()
{
NoCache = true,
NoStore = true
};
return response;
我们在Web应用程序中也注意到了这个问题。该网络应用程序有一个下载按钮,用户可以下载PDF文件。Firefox在当前选项卡中显示PDF文件,这实际上会杀死网络应用程序。
经过一点研究,这似乎是一个有意的功能,请参阅Firefox 98的发行说明:
当您在Firefox首选项设置中设置应用程序打开特定类型的文件时,这些文件将自动打开,甚至是网站提供的带有"内容处置:附件";。这同样适用于默认情况下设置为在Firefox中打开的PDF文件。这是对错误453455的修复。
就我个人而言,虽然我可以理解一些用户可能希望这适用于表现不佳的网页,但这是表现良好的网络应用程序的问题。
在锚点上设置下载属性似乎也不起作用,Firefox仍然在线显示文件(使用Firefox 99.0测试(
据我所知,如果浏览器不允许,你就不能强迫浏览器下载该文件。其他网络应用程序,如OwnCloud或Google Drive也有同样的问题——如果你右键单击Google Drive中的PDF文件,然后单击Dowload
,Firefox仍然会内联打开PDF文件,而Chrome会下载它。
目前,你能做的最好的事情似乎是在一个新的选项卡中打开文件,以防止网络应用程序或网页被下载的文件取代(谷歌硬盘似乎也在这样做(。您可以在新的选项卡或窗口中打开下载,例如通过<a>
链接上的target属性或通过<button>
元素上的formtarget attribution。
在试图找到与OP相同问题的解决方案后,我找到了@blutorange的答案。然而,就在我到达这里之前,我在2013年偶然发现了这个答案https://stackoverflow.com/a/16515146其建议将Content-Type
报头设置为application/octet-stream
而不是application/pdf
。
我试过那个解决方案,你知道吗?它有效!PDF会自动在Firefox中的一个新选项卡中打开,但至少它不会取代我的应用程序的选项卡,所以耶!Chrome似乎也不介意,我电脑上的PDF查看器也能将文件识别为PDF。
现在,这可能不是最";正确的";修复了我们面临的问题,但这是强制打开新标签的替代方案。