Верх страницы
Обложка к записи Отдать PDF на скачку
Время для прочтения: 0 мин. 36 сек.

Отдать PDF на скачку

При проектировании одного проекта столкнулся с проблемой некоторых браузеров открывать PDF-документ непосредственно в окне браузера.

Это чревато тем, что вы вообще ничего никогда не сможете просмотреть, либо при сохранении открытого файла получите «битый» документ.

Было принято решение отдавать файлы скриптом. Чтобы не мудрить с движком — подпилил все напильником через mod_rewrite.

В .htaccess пишем:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule \.pdf$ /load.php [L,QSA]
</IfModule>

Ссмысл правила в том, что все запросы, которые оканчиваются на .pdf, заворачиваются на файл load.php в корне сайта.

В самом этом файле пишем нечто подобное (проверки опущены):

<?php
$root = dirname(__FILE__);
$request = $_SERVER['REQUEST_URI'];
$filename = basename($request);
$path = $root.'/'.$request;
  
if (file_exists($path)) {
    if (ob_get_level()) {
        ob_end_clean();
    }
    header("Content-Type: application/pdf; charset=UTF-8");
    header("Content-Length: ".filesize($path));
    header("Content-Disposition: attachment; filename=\"{$filename}\"");
    header("Content-Transfer-Encoding: binary");
    header("Cache-Control: must-revalidate");
    header("Pragma: no-cache");
    header("Expires: 0");
    readfile($path);
    die;
}

Способ второй

Основан на использовании модуля mod_headers и директивы FilesMatch:

# Проверим наличие модуля
<IfModule mod_headers.c>
    # Выберем запросы на PDF без учета регистра имени файлов
    <FilesMatch "\.(?i:pdf)$">
    # Отправим соответствующие заголовки
    ForceType application/octet-stream
    Header set Content-Disposition attachment
    </FilesMatch>
</IfModule>

Если возникнут вопросы — пишите в комментах.

Ссылки

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, OpenCart, DLE, Laravel, Moonshine, Symfony, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

18 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Gambrinus
12 лет назад

Доброго времени суток!
Статья небось старая, но тем не менее спрошу.
Использую идею первого способа для отдачи pdf и djvu файлов.
Возникла такая проблема: при скачивании файла Opera, IE — все ок, а при скачивании Хромом имя файла сохраняется как крякозябры. Почему-то с кодировкой в имени проблемы. С чем это может быть связано? Возможно ли это как-то пофиксить?

Заранее спасибо.

Николай
Николай
12 лет назад

При использовании второго способо гугл хром с настройками по умолчанию не скачивает файл и запрос на скачивание тоже не выдает.

Павел
Павел
12 лет назад

А как сделать, чтобы наоборот принудительно pdf открывался в браузере ,а не закачивался?

Павел
Павел
12 лет назад

Жаль, не хотелось так накручивать.

Алена Ш
10 лет назад

Здравствуйте, Михаил!
Поняла, что эта статья — то, что мне нужно, но никак не могу дойти сознанием что именно нужно сделать, а точнее куда именно прописывать скрипты. У меня сайт на вордпрессе. Мне нужно, чтобы с него скачивалась книга в формате .pdf, которая просто открывается. В архив упаковывать не хочу, а где найти вот это :В .htaccess — не знаю. Подскажите, пожалуйста, если можете. Спасибо! На всякий случай мой сайт http:\kombriz.ru

mihdan
10 лет назад
Ответить на  Алена Ш

В корне вашего сайта на FTP должен быть файл .htaccess, если его нет — создайте. Наличие точки в начале обязательно

Алена Ш
10 лет назад
Ответить на  mihdan

О, у меня есть! Большое спасибо! Буду мудрить)

Что-то ничего не выходит, когда я вношу в этом файле какие-нибудь изменения, у меня вместо сайта открывается вот такое окно: что-то скриншот не цепляется..

Алена Ш
10 лет назад
Ответить на  mihdan

вот такое

mihdan
10 лет назад
Ответить на  Алена Ш

Либо модуля у вас нет такого на сервере либо хостер запрещает его использовать. У вас не бесплатный хостинг? Либо вы чтот неправильно скопировали и вставили (

Алена Ш
10 лет назад
Ответить на  mihdan

нет, платный. Спринхост
Я заменяла полностью, или только строку, вставляла в середину и в конце, короче пробовала по-разному. У меня вот такой исходный файл, попробую вставить скриншот, если получится:

Алена Ш
10 лет назад
Ответить на  mihdan

вот такой:

Алена Ш
10 лет назад
Ответить на  mihdan

Вопрос, наверное, не в тему, но если освоить курсы PHP, я разберусь с этим? Как Вы думаете?

mihdan
10 лет назад
Ответить на  Алена Ш

Думаю, что да, но тут нет ничего сложного

oleg.ch
oleg.ch
9 лет назад

в вордпрессе не работает почему то, на чистом сайте получилось

mihdan
9 лет назад
Ответить на  oleg.ch

Ваш пример покажите, какой вариант используете. Покажите htaccess.

Предыдущая запись
Следующая запись

Давайте дружить
в Telegram

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы