Я не могу принудительно загрузить PDF-файл - PullRequest
0 голосов
/ 10 января 2020

Я пытался найти решение своей проблемы в течение 2 дней и не могу заставить свой код работать. Моя цель - загрузить файл PDF одним нажатием кнопки, но я хочу, чтобы путь к файлу был скрыт для пользователей. Проект, над которым я работаю, использует систему Kohana (3.3). Я пытался вызвать эту функцию с помощью ajax:

public function action_download_pdf()
{
        $this->auto_render = false;
        if ($this->request->post()) {

            $data = $this->request->post();
            $file = 'uploads/pdfs_folder/'.$data['pdf_number'].'.pdf';

            if (file_exists($file)) {
                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename='.$data['pdf_number'].'.pdf');
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');
                header('Content-Length: ' . filesize($file));
                ob_clean();
                flush();
                readfile($file);
                exit;
            }
        }
    }

Я получаю код состояния: 200 ОК, но я могу отобразить его только на вкладке «Предварительный просмотр» в консоли разработчика.

https://i.stack.imgur.com/vyAiK.jpg

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

Ответы [ 3 ]

0 голосов
/ 10 января 2020

код ниже работал нормально для меня


<?php
    if(isset($_REQUEST['path']) && $_REQUEST['path'] != "") {

        $file_url = $_REQUEST['path'];
        $pdfname = basename ($file_url);
        header('Content-Type: application/pdf');
        header("Content-Transfer-Encoding: Binary");
        header("Content-disposition: attachment; filename=".$pdfname);
        readfile($file_url);
    }
?>

В вашем коде я заметил

header('Content-Type: application/octet-stream');

Ссылка на тип контента в PHP важна, это MIME-тип файл, который вы защищаете. Если, например, вместо этого вы сохранили файл MP3, вам нужно заменить application / pdf на audio / mpeg.

Надеюсь, это поможет вам.

Спасибо

0 голосов
/ 15 января 2020

Вот как я решил свою проблему:

Я создал таблицу в своей БД, в которой я генерирую и сохраняю одно поддельное число и одно действительное число. Когда я достигаю шага с кнопкой, чтобы загрузить PDF, я отправляю через эту форму форму, которая запускает функцию в моем контроллере. Функция - это код, который я изначально разместил. Я проверяю фальшивый номер в своей таблице и получаю реальный.

0 голосов
/ 10 января 2020

Это отлично сработало для меня.

if ($filename) {

    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=".basename($filename)); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile("$filename");

}
...