Chrome отправляет два запроса при загрузке PDF (и отменяет один из них)
Я заметил, что всякий раз, когда вы загружаете PDF в Chrome, он последовательно делает два запроса, а затем отменяет один из них. Это приводит к тому, что запрос регистрируется дважды в моем веб-приложении, что не нужно. Есть ли способ заставить Chrome сделать только один запрос на PDF?
Я немного исследовал эту тему и не нашел достаточного ответа. Тесно связанные ответы предполагают, что проблема в том, что Chrome ищет значок, но вкладка сети показывает, что он фактически выполняет один и тот же запрос дважды, а затем отменяет второй запрос.
Есть ли способ предотвратить повторный запрос Chrome?
Ниже приведена ссылка на случайный PDF-файл, который я нашел через Google и который при нажатии должен демонстрировать поведение. Я бы опубликовал изображение своей вкладки в сети в devtools, но это мой первый пост о переполнении стека, и сайт запрещает мне загружать изображения.
https://www.adobe.com/enterprise/accessibility/pdfs/acro6_pg_ue.pdf
5 ответов
Это похоже на ошибку в Chrome: https://bugs.chromium.org/p/chromium/issues/detail?id=587709
Проблема заключается в том, что Chrome при загрузке iframe, возвращающего поток PDF, записывает в этот iframe тег "embed", который снова содержит тот же URL-адрес, что и iframe. Это снова вызывает запрос на этот URL, но Chrome немедленно отменяет его. (см. вкладку сети) Но к тому времени ущерб уже нанесен.
У нас такая же проблема, и она не возникает в Firefox или IE.
Мы все еще ищем хорошее решение этой проблемы.
В моем случае проблема не была связана с браузером. Я заметил, что манипуляции с DOM нашего плагина полосы прокрутки (OverlayScrollbars) перезагружают встроенные данные pdf и вызывают контроллер более одного раза из-за событий конструкции или уничтожения плагина. После того, как я инициализировал полосу прокрутки до того, как DOM будет готов, проблема решена.
У меня была такая же проблема в iframe. Я отключил расширение PDF Viewer, и проблема исчезла. Я думаю, что расширение загружает файл дважды. Первый раз, чтобы получить размер, второй раз, чтобы загрузить с индикатором выполнения (используя размер, собранный в первом запросе)
Я все еще пытаюсь найти правильное решение, но в качестве частичного "решения" на данный момент вы можете иметь два варианта
1) установить расположение содержимого в заголовке "attachment"
установка этого в "встроенный" вызовет запуск Chrome второго отмененного вызова
так, например, вы можете сделать что-то подобное (nodejs или, например, в примере)
res.writeHead(200, {
'Content-Type' : 'application/pdf',
'Access-Control-Allow-Origin' : '*',
'Content-Disposition' : 'attachment; filename=print.pdf'
});
к сожалению, это решение заставит браузер сразу загрузить pdf вместо того, чтобы сделать его встроенным, и это не может быть желательным
2) добавление "expires" в заголовках, это решение всегда будет запускать второй отмененный вызов, но сервер игнорирует его
так, например, вы можете сделать что-то подобное (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))
});
Я пробовал другие решения, и ни одно не помогло мне, я немного опоздал, я знаю, но для записи я решил это следующим образом:
Добавление атрибута загрузки :
В моем случае я использовал форму, поэтому она выглядит так:
<form action="/package.zip" method="POST" download>
Это сработало в Brave и Safari, которые ранее демонстрировали ту же проблему, я думаю, это сработает для Chrome.