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

Posted

技术标签:

【中文标题】Chrome 在下载 PDF 时发送两个请求(并取消其中一个)【英文标题】:Chrome sends two requests when downloading a PDF (and cancels one of them) 【发布时间】:2015-12-19 22:43:29 【问题描述】:

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

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

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

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

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

【问题讨论】:

***.com/questions/1817750/… 这个人几乎回答了我的问题。 @gredmagdits 我认为这与“Accept-Ranges”标头无关,因为即使没有返回“Accept-Ranges”标头,我也会遇到问题。 看到这个答案:***.com/a/37600239/32429 【参考方案1】:

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

【讨论】:

【参考方案2】:

我已经尝试了其他解决方案,但没有一个对我有用,我知道我有点晚了,但为了记录,我通过以下方式解决了这个问题:

添加 download 属性:

在我的例子中,我使用了一个表单,所以它是这样的:

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

这在 Brave 和 Safari 上有效,之前显示相同的问题,我认为它适用于 Chrome。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

例如,您可以执行类似的操作(例如 nodejs resp)

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

不幸的是,这个解决方案将迫使浏览器立即下载 pdf 而不是内联渲染它,这可能是不可取的

2) 在标题中添加“过期” 此解决方案将始终触发第二个已取消的调用,但它会被服务器忽略

例如,您可以执行类似的操作(例如 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))
);

【讨论】:

【参考方案5】:

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

问题在于,Chrome 在加载返回 PDF 流的 iframe 时,会在该 iframe 内写入一个“嵌入”标签,该标签再次包含与 iframe 相同的 URL。这会再次触发对该 URL 的请求,但 Chrome 会立即取消它。 (见网络标签) 但到那时,伤害已经造成。

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

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

【讨论】:

这是我遇到的问题。有没有想过什么? 不,我们必须调整我们的后端,使其支持多个请求。对不起!

以上是关于Chrome 在下载 PDF 时发送两个请求(并取消其中一个)的主要内容,如果未能解决你的问题,请参考以下文章

Pdf下载使用java jersey和spring security在给出邮递员的请求时给出错误

Mpdf 不从内联 chrome 浏览器下载 pdf(但显示 pdf)

在快速路由响应中发送 PDF 并强制浏览器下载

谷歌打开pdf文件,变成下载了,重复下载

Google Analytics GIF 请求未发送

chrome保存pdf位置