Проблема с открытием PDF-файла в Adobe Reader, загруженного из базы данных MySQL через PHP - PullRequest
0 голосов
/ 18 июня 2020

Я написал код PHP, который загружает файл PDF из базы данных MySQL на сервере. Код отлично работает, и я могу просматривать / скачивать / открывать PDF-файл из разных браузеров. Однако, когда я загружаю файл и пытаюсь открыть его через Adobe Reader, я получаю сообщение о том, что файл не может быть открыт, потому что «потому что это либо неподдерживаемый тип файла, либо потому, что файл был поврежден (например, он был отправлен как вложение электронной почты и не был правильно декодирован) "

Я уверен, что это что-то глупое, что я забыл сделать в моем коде. Ниже приведен код PHP, который я использую:

// Downloads files
if (isset($_GET['scenario_id'])) {
    $scenario_id = $_GET['scenario_id'];

    // fetch file to download from database
    $sql = "SELECT * FROM  market_plans_pdfs WHERE scenario_id=$scenario_id";
    $result = mysqli_query($connect, $sql);

    $file = mysqli_fetch_assoc($result);
    $pdf_file=$file['pdf_file'];


    $filename=$file['scenario_name'];


    if (isset($filename)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/pdf');
        header('Content-Disposition: inline; filename="'.basename($filename).'"');//set content-disposition as "inline" as opposed to "attachment" so that it opens first in the browser
        header('Content-Transfer-Encoding: binary');
        header('Accept-Ranges: bytes');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        @readfile("data:application/pdf;base64,$pdf_file");
    }

}

Любая помощь будет принята с благодарностью, поскольку я безуспешно пробовал различные решения в Интернете.

1 Ответ

1 голос
/ 18 июня 2020

Когда вы меняете некоторые заголовки, вы должны сделать это перед любым выводом, потому что заголовок должен быть отправлен в начале, например:

Это недопустимо:

echo 'Test';
header('Content-Description: File Transfer');

Thats не ваш случай, но вы делаете аналогичную ошибку на другом конце.

Когда вы печатаете данные файла, например, как вы это делаете в своем вопросе, нет функции, которая сообщала бы, что «ваши данные заканчиваются здесь », в качестве файла принимается только весь вывод.

Если вы не можете отделить передачу файла от другого вывода, есть простое решение, попробуйте его:

if (isset($filename)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
    header('Content-Disposition: inline; filename="'.basename($filename).'"');//set content-disposition as "inline" as opposed to "attachment" so that it opens first in the browser
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    echo base64_decode($pdf_file);
    exit(); // nothing else will happen, no website which is shown otherwise
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...