Верх страницы
Обложка к записи Отдать 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>

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

Ссылки

ВКонтакте
Одноклассники
Telegram
WhatsApp

Комментарии
Подписаться
Уведомить о
guest
18 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Gambrinus
10 лет назад

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

вот такое

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

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

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

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

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

вот такой:

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

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

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

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

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

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

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

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