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

问题描述 投票:22回答:3

我注意到,每当您在Chrome中下载PDF时,它始终会发出两个请求,然后取消其中一个请求。这导致请求在我的Web应用程序中注册了两次,这是不需要的。有没有办法让Chrome只提出一个PDF请求?

我现在已经研究过这个话题了,我还没有找到足够的答案。与密切相关的答案表明问题在于Chrome正在寻找一个图标,但网络标签显示它实际上是两次发出相同的请求,然后取消第二个请求。

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

以下是我通过Google找到的随机PDF文件的链接,点击后该文件会演示该行为。我会在devtools中发布我的网络选项卡的图片,但这是我在Stack Overflow上的第一篇文章,该网站禁止我上传图片。

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

google-chrome pdf
3个回答
11
投票

它看起来像Chrome中的一个错误:https://bugs.chromium.org/p/chromium/issues/detail?id=587709

问题是Chrome在加载返回PDF流的iframe时会在iframe中写入一个“embed”标记,该标签再次包含与iframe相同的网址。这会再次触发对该网址的请求,但Chrome会立即取消该网址。 (参见网络标签)但到那时,损坏已经完成。

我们在这里遇到了同样的问题,它不会出现在Firefox或IE中。

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


0
投票

我仍然试图找到一个合适的解决方案,但作为一个部分“修复”现在你可以有两个选择

1)在标题中将内容处置设置为“附件”

将其设置为“内联”会导致chrome运行第二次取消的呼叫

所以例如你可以做类似的事情(示例中为nodejs resp)

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

不幸的是,这个解决方案将迫使浏览器直接下载pdf而不是内联渲染,这可能不是很令人沮丧

2)在标题中添加“expires”,此解决方案将始终触发第二个取消的呼叫,但服务器会忽略它

所以例如你可以做类似的事情(示例中为nodejs resp)

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

0
投票

我在iframe中遇到了同样的问题。我打开了PDF Viewer扩展程序,问题就消失了。我在想扩展程序两次下载文件。第一次获取大小,第二次使用进度条下载(使用第一次请求中收集的大小)

© www.soinside.com 2019 - 2024. All rights reserved.