Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.09.2020, 10:46
Интересующийся
Отправить личное сообщение для slan Посмотреть профиль Найти все сообщения от slan
 
Регистрация: 14.11.2012
Сообщений: 12

Сохранить 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?
Ответить с цитированием
  #2 (permalink)  
Старый 10.09.2020, 10:54
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Content-Disposition: attachment
попробуйте
Ответить с цитированием
  #3 (permalink)  
Старый 10.09.2020, 11:06
Интересующийся
Отправить личное сообщение для slan Посмотреть профиль Найти все сообщения от slan
 
Регистрация: 14.11.2012
Сообщений: 12

Сообщение от Vlasenko Fedor Посмотреть сообщение
Content-Disposition: attachment
попробуйте
В этом случае сразу открывается диалог сохранения pdf-файла. Работает корректно. Но цель стоит другая - в любом случае открывать pdf-файл для просмотра, и чтобы из этого просмотрщика пользователь мог и сохранить при желании.
Ответить с цитированием
  #4 (permalink)  
Старый 10.09.2020, 11:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

A какой URL имеет то самое окно, в котором открывается pdf?
Наверно того самого скрипта, который его формирует.
Но есть
header("expires: 0");
Хром может из-за этого для сохранения заново обратится по указанному URL.
А скрипт по этому URL пошлет снова документ и все заголовки, включая
header("Content-Type: application/pdf; name=\"".$file_name."\"");
header("Content-Disposition: inline; filename=\"".$file_name."\"");
Ответить с цитированием
  #5 (permalink)  
Старый 10.09.2020, 11:56
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от slan Посмотреть сообщение
в любом случае открывать pdf-файл для просмотра
это зависит от настроек браузера, есть ли унего просмотрщик пдф, активирован ли он
Ответить с цитированием
  #6 (permalink)  
Старый 10.09.2020, 12:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

header('Content-Type: application/pdf');
header("Content-Disposition: inline; filename=name.pdf");
Ответить с цитированием
  #7 (permalink)  
Старый 10.09.2020, 12:11
Интересующийся
Отправить личное сообщение для slan Посмотреть профиль Найти все сообщения от slan
 
Регистрация: 14.11.2012
Сообщений: 12

Сообщение от voraa Посмотреть сообщение
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.
Ответить с цитированием
  #8 (permalink)  
Старый 10.09.2020, 12:12
Интересующийся
Отправить личное сообщение для slan Посмотреть профиль Найти все сообщения от slan
 
Регистрация: 14.11.2012
Сообщений: 12

Сообщение от Vlasenko Fedor Посмотреть сообщение
это зависит от настроек браузера, есть ли унего просмотрщик пдф, активирован ли он
Это всё понятно. Но как тогда объяснить странное поведение хрома при этом?
Ответить с цитированием
  #9 (permalink)  
Старый 10.09.2020, 12:16
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от slan
Но как тогда объяснить странное поведение хрома при этом?
Странности не в хроме, а скорее всего в работе скрипта вашего, нет проблем в хроме. Можете проверить прямой ссылкой на файл.
Ответить с цитированием
  #10 (permalink)  
Старый 10.09.2020, 12:19
Интересующийся
Отправить личное сообщение для slan Посмотреть профиль Найти все сообщения от slan
 
Регистрация: 14.11.2012
Сообщений: 12

Сообщение от laimas Посмотреть сообщение
Странности не в хроме, а скорее всего в работе скрипта вашего, нет проблем в хроме. Можете проверить прямой ссылкой на файл.
Наверное так и есть, правда нееясно, почему же в Firefox всё отрабатывает как нужно.
Файла не сохраняется на сервере, он генерится и сразу отдаётся.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не воспроизводится mp3 файл в Chrome прописанный в html файле. III (X)HTML/CSS 3 20.02.2020 18:42
Как сохранить произвольный файл в веб-хранилище (localstorage)? ice99 Общие вопросы Javascript 2 05.01.2018 09:26
Перейти на страницу и сохранить файл Гробовщик Общие вопросы Javascript 2 26.04.2017 18:39
Как правильно сохранить загруженный файл? 2chan Node.JS 10 03.04.2016 23:11
Pdf файл тег embed переход на страницу sparrow Общие вопросы Javascript 4 20.01.2015 12:26