Сохранить pdf-файл из просмотрщика Chrome
Добрый день. Ситуация такая: по запросу из браузера клиента на сервере генерится pdf, который потом отдаётся в браузер клиента, в новое окно для просмотра.
Код:
function send_pdf_file($file_name,$contents) Если нажать на кнопку Сохранить, то в случае браузера Firefox всё отрабатывается корректно - пользователь получает запрос на сохранение pdf-файла и сохраняет его, в любой момент gjrf jnrhsnj jryj просмотрщика. В случае же браузера Chrome (и Edge), если на кнопку успеть нажать в первые 5 секунд после открытия просмотрщика - то всё тоже ок , если же нажать после истечения 5 секунд - то открывается запрос на сохранение не pdf-файла, а php-скрипта, который дёргался для формирования этого pdf. Подскажите, как победить эту ситуацию с Chrome? |
Content-Disposition: attachment
попробуйте |
Цитата:
|
A какой URL имеет то самое окно, в котором открывается pdf?
Наверно того самого скрипта, который его формирует. Но есть header("expires: 0"); Хром может из-за этого для сохранения заново обратится по указанному URL. А скрипт по этому URL пошлет снова документ и все заголовки, включая header("Content-Type: application/pdf; name=\"".$file_name."\""); header("Content-Disposition: inline; filename=\"".$file_name."\""); |
Цитата:
|
Цитата:
header('Content-Type: application/pdf'); header("Content-Disposition: inline; filename=name.pdf"); |
Цитата:
Проверил - наличие header("expires: 0") никак не влияет на поведение хрома: при сохранении в первые 5 секунд выдаётся диалог на сохранение pdf, в последующие диалог на сохранение скрипта php. Если попробовать сохранить скрипт, то хром выдаёт Ошибка: ошибка сети. При этом никаких запросов на вкладке Network в Инструментах разработчика не появляется. Похоже как-то эти самые 5 секунд связаны с наличием в Response Headers такого хедера Keep-Alive: timeout=5, max=100. |
Цитата:
|
Цитата:
|
Цитата:
Файла не сохраняется на сервере, он генерится и сразу отдаётся. |
Цитата:
У вас какие-то проблемы в логике скрипта надо полагать. |
Цитата:
|
Цитата:
сделал в скрипте вот так: header("Content-Type: application/pdf; name=\"1.pdf\""); header("Content-Disposition: inline; filename=\"1.pdf\""); readfile("../1.pdf"); Результат тот же самый. 5 секунд скачивается pdf, после хром предлагает скачать сам скрипт. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
laimas,
Спасибо за помощь. Посмотрел ваше видео, у вас отрабатывает так как нужно. Положил готовый pdf на сервер, на кнопку повесил href. В этом случае отрабатывает как надо, файл скачивается в любой момент времени. В моем же случае, вида window.open("/get_pdf.php", "_blank"); отрабатывает не так как хотелось бы. |
Цитата:
|
Цитата:
|
Пробовал ставить туда разные значения, изменений не было.
|
Цитата:
|
Цитата:
Положил на сервер HTML <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru"> <meta name="viewport" content="width=device-width, initial-scale=1.0" > <title>TESTE </title> </head> <body> <button id='gpdf'>Load pdf</button> <script> document.getElementById('gpdf').addEventListener('click', ()=> { window.open('gpdf.php','fpdf') }) </script> </body> </html> Вот такой gpdf.php <?php header("Content-Type: application/pdf; name=\"file.pdf\""); header("Content-Disposition: inline; filename=\"file.pdf\""); readfile("file.pdf"); ?> и какой то file.pdf Все в хроме нормально работает. В новой вкладке открывается pdf. Сохраняется, как pdf хоть через 5 сек, хоть через 50 |
Цитата:
|
Цитата:
|
Всем спасибо за помощь. На другом сервере (nginx) всё отработало как надо.
Проблемы возникают на apache, в нём присутствует в Response Headers заголовок Keep-Alive: timeout=5, max=100. Вот эти 5 секунд. Если в скрипте написать вот так: header("Connection: close"); то файл не скачивается из просмотрщика прямо сразу, предлагает скачать скрипт. |
Цитата:
Поставил в скрипт указанный заголовок Все равно приходит и скачивается pdf. Хоть через 5 сек, хоть через 50. Вот, что имеем в сети General Request URL: http://localhost/teste/xtests/testpdf1/gpdf.php Request Method: GET Status Code: 200 OK Remote Address: 127.0.0.1:80 Referrer Policy: no-referrer-when-downgrade Response Headers Connection: close Content-Disposition: inline; filename="file.pdf" Content-Type: application/pdf; name="file.pdf" Date: Fri, 11 Sep 2020 08:58:01 GMT Server: Apache Transfer-Encoding: chunked Request Headers Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7 Cache-Control: no-cache Connection: keep-alive DNT: 1 Host: localhost Pragma: no-cache Referer: http://localhost/teste/xtests/testpdf1/indexa.html Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: same-origin Sec-Fetch-User: ?1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36 |
Часовой пояс GMT +3, время: 07:34. |