Chrome在下载PDF时发送两个请求(并取消其中一个)

24

我注意到当你在Chrome中下载PDF时,它会始终发出两个请求,然后取消其中一个。这会导致我的Web应用程序中注册该请求两次,这是我不想要的。有没有办法让Chrome仅为PDF制作一个请求?

我现在已经对此主题进行了相当多的研究,但我没有找到令人满意的答案。相关答案表明问题在于Chrome正在寻找网站图标,但网络选项卡显示它实际上是两次进行同样的请求,然后取消第二个请求。

有没有办法防止Chrome发出第二个请求?

以下是我通过Google找到的一个随机PDF文件的链接,当单击时应该演示此行为。我本来想在开发工具的网络选项卡中发布图片,但这是我在Stack Overflow上的第一篇文章,该网站禁止我上传图片。

https://www.adobe.com/enterprise/accessibility/pdfs/acro6_pg_ue.pdf


1
这个人基本上回答了我的问题。 - gregmagdits
3
我认为这与“Accept-Ranges”头部无关,因为即使没有返回“Accept-Ranges”头部,我仍然会遇到这个问题。 - Olivier Masseau
1
请参考这个答案:https://dev59.com/xXI-5IYBdhLWcg3whImk#37600239 - Glen Little
5个回答

11

看起来这是Chrome的一个bug:https://bugs.chromium.org/p/chromium/issues/detail?id=587709

问题在于,当Chrome加载返回PDF流的iframe时,它会在该iframe中写入一个"embed"标签,该标签包含与iframe相同的URL。这会触发再次请求该URL,但Chrome立即取消该请求。(请参见网络选项卡) 但到那时为止,损坏已经造成了。

我们在这里也有同样的问题,在Firefox或IE中不会发生。

我们仍在寻找解决这个问题的好方法。


这是我遇到的问题。你有找到解决方法吗? - James Parsons
2
不好意思,我们必须调整后端以支持多个请求。抱歉! - Moeri

0

我尝试了其他的解决方案,但都没有起作用。我知道我有点晚了,但只是为了记录一下,我是这样解决的:

添加 download 属性:

在我的情况下,我正在使用一个表单,所以它应该像这样:

<form action="/package.zip" method="POST" download>

这个在Brave和Safari上运行正常,之前都有同样的问题,我认为在Chrome上也会有效。


0

在我的情况下,问题并不是与浏览器有关。我注意到我们的滚动条插件(OverlayScrollbars)的DOM操作会重新加载嵌入式PDF数据,并由于插件的构造或销毁事件而多次调用控制器。在DOM准备就绪之前初始化滚动条后,问题得到解决。


0

我在iframe中遇到了同样的问题。我关闭了PDF查看器扩展程序,问题就消失了。我认为这个扩展程序会下载文件两次。第一次是为了获取大小,第二次是使用第一个请求中收集的大小来下载并显示进度条。


0

我仍在努力寻找一个合适的解决方案,但现在可以有两个部分的“修复”选项:

1)在头文件中将内容设置为“附件”

将其设置为“内联”会导致Chrome运行第二个取消调用

例如,您可以执行以下操作(示例中的nodejs resp)

res.writeHead(200, {
    'Content-Type' : 'application/pdf',
    'Access-Control-Allow-Origin' : '*',
    'Content-Disposition' : 'attachment; filename=print.pdf'
});

不幸的是,这个解决方案会强制浏览器立即下载PDF而不是内联呈现,这可能不是理想的

2)在头部添加“过期时间” 这个解决方案总是会触发第二个取消调用,但服务器会忽略它

因此,例如你可以像这样做(在nodejs中的示例)

res.writeHead(200, {
    'Content-Type' : 'application/pdf',
    'Access-Control-Allow-Origin' : '*',
    'Content-Disposition' : 'inline; filename=print.pdf',
    'Expires' : new Date(new Date().getTime() + (60000))
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接