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

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

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

В .htaccess пишем:

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

Ссмысл правила в том, что все запросы, которые оканчиваются на .pdf, заворачиваются на файл load.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);
}
?>

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

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

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

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

Ссылки

Источник: https://www.kobzarev.com/programming/give-the-pdf-file-of-the-jump/

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

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: