Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сохранить pdf-файл из просмотрщика Chrome (https://javascript.ru/forum/misc/80999-sokhranit-pdf-fajjl-iz-prosmotrshhika-chrome.html)

slan 10.09.2020 10:46

Сохранить pdf-файл из просмотрщика Chrome
 
Добрый день. Ситуация такая: по запросу из браузера клиента на сервере генерится pdf, который потом отдаётся в браузер клиента, в новое окно для просмотра.
Код:

function send_pdf_file($file_name,$contents)
{
  header("Content-Length: ".strlen($contents));
  header("Content-Type: application/pdf; name=\"".$file_name."\"");
  header("Content-Disposition: inline; filename=\"".$file_name."\"");
  header("expires: 0");
  echo $contents;   
}

Всё хорошо отрабатывает: в браузере пользователя открывается окно с просмотром pdf-файла.
Если нажать на кнопку Сохранить, то в случае браузера Firefox всё отрабатывается корректно - пользователь получает запрос на сохранение pdf-файла и сохраняет его, в любой момент gjrf jnrhsnj jryj просмотрщика.
В случае же браузера Chrome (и Edge), если на кнопку успеть нажать в первые 5 секунд после открытия просмотрщика - то всё тоже ок , если же нажать после истечения 5 секунд - то открывается запрос на сохранение не pdf-файла, а php-скрипта, который дёргался для формирования этого pdf.
Подскажите, как победить эту ситуацию с Chrome?

Vlasenko Fedor 10.09.2020 10:54

Content-Disposition: attachment
попробуйте

slan 10.09.2020 11:06

Цитата:

Сообщение от Vlasenko Fedor (Сообщение 528722)
Content-Disposition: attachment
попробуйте

В этом случае сразу открывается диалог сохранения pdf-файла. Работает корректно. Но цель стоит другая - в любом случае открывать pdf-файл для просмотра, и чтобы из этого просмотрщика пользователь мог и сохранить при желании.

voraa 10.09.2020 11:56

A какой URL имеет то самое окно, в котором открывается pdf?
Наверно того самого скрипта, который его формирует.
Но есть
header("expires: 0");
Хром может из-за этого для сохранения заново обратится по указанному URL.
А скрипт по этому URL пошлет снова документ и все заголовки, включая
header("Content-Type: application/pdf; name=\"".$file_name."\"");
header("Content-Disposition: inline; filename=\"".$file_name."\"");

Vlasenko Fedor 10.09.2020 11:56

Цитата:

Сообщение от slan (Сообщение 528724)
в любом случае открывать pdf-файл для просмотра

это зависит от настроек браузера, есть ли унего просмотрщик пдф, активирован ли он

laimas 10.09.2020 12:06

Цитата:

Сообщение от Vlasenko Fedor
это зависит от настроек браузера, есть ли унего просмотрщик пдф

Вот это в точку, ибо никаких проблем не будет он создавать от заголовков ни в хроме, ни в других. Вообще-то достаточно и двух.

header('Content-Type: application/pdf');
header("Content-Disposition: inline; filename=name.pdf");

slan 10.09.2020 12:11

Цитата:

Сообщение от voraa (Сообщение 528727)
A какой URL имеет то самое окно, в котором открывается pdf?
Наверно того самого скрипта, который его формирует.
Но есть
header("expires: 0");
Хром может из-за этого для сохранения заново обратится по указанному URL.
А скрипт по этому URL пошлет снова документ и все заголовки, включая
header("Content-Type: application/pdf; name=\"".$file_name."\"");
header("Content-Disposition: inline; filename=\"".$file_name."\"");

Вы правы, в том окне URL скрипта.
Проверил - наличие header("expires: 0") никак не влияет на поведение хрома: при сохранении в первые 5 секунд выдаётся диалог на сохранение pdf, в последующие диалог на сохранение скрипта php. Если попробовать сохранить скрипт, то хром выдаёт Ошибка: ошибка сети. При этом никаких запросов на вкладке Network в Инструментах разработчика не появляется.
Похоже как-то эти самые 5 секунд связаны с наличием в Response Headers такого хедера Keep-Alive: timeout=5, max=100.

slan 10.09.2020 12:12

Цитата:

Сообщение от Vlasenko Fedor (Сообщение 528728)
это зависит от настроек браузера, есть ли унего просмотрщик пдф, активирован ли он

Это всё понятно. Но как тогда объяснить странное поведение хрома при этом?

laimas 10.09.2020 12:16

Цитата:

Сообщение от slan
Но как тогда объяснить странное поведение хрома при этом?

Странности не в хроме, а скорее всего в работе скрипта вашего, нет проблем в хроме. Можете проверить прямой ссылкой на файл.

slan 10.09.2020 12:19

Цитата:

Сообщение от laimas (Сообщение 528732)
Странности не в хроме, а скорее всего в работе скрипта вашего, нет проблем в хроме. Можете проверить прямой ссылкой на файл.

Наверное так и есть, правда нееясно, почему же в Firefox всё отрабатывает как нужно.
Файла не сохраняется на сервере, он генерится и сразу отдаётся.


Часовой пояс GMT +3, время: 20:34.