исправьте заголовки PHP для загрузки файла PDF

Я действительно изо всех сил пытаюсь заставить свое приложение открывать PDF, когда пользователь нажимает на ссылку.

До сих пор тег привязки перенаправляет к странице, которая отправляет заголовки, которые являются:

$filename='./pdf/jobs/pdffile.pdf;

$url_download = BASE_URL . RELATIVE_PATH . $filename;


header("Content-type:application/pdf");



header("Content-Disposition:inline;filename='$filename");

readfile("downloaded.pdf");

это, кажется, не работает, кто-либо успешно отсортировал эту проблему в прошлом?

62
задан 19 November 2013 в 23:27

6 ответов

Пример 2 на w3schools показывает то, чего Вы пытаетесь достигнуть.

<?php
header("Content-type:application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition:attachment;filename='downloaded.pdf'");

// The PDF source is in original.pdf
readfile("original.pdf");
?>

Также помнят, что,

важно заметить, что заголовок () нужно назвать, прежде чем любая эффективная выходная мощность отправляется (В PHP 4 и позже, можно использовать выходную буферизацию для решения этой проблемы)

115
ответ дан 31 October 2019 в 13:32
$name = 'file.pdf';
//file_get_contents is standard function
$content = file_get_contents($name);
header('Content-Type: application/pdf');
header('Content-Length: '.strlen( $content ));
header('Content-disposition: inline; filename="' . $name . '"');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
echo $content;
23
ответ дан 31 October 2019 в 13:32

Существуют некоторые вещи, которые рассмотрят в Вашем коде.

Первый, запишите те заголовки правильно. Вы никогда не будете видеть, что любой сервер отправляет Content-type:application/pdf, заголовок Content-Type: application/pdf, расположен с интервалами, с капитализированными первыми буквами и т.д.

, имя файла в Content-Disposition является именем файла только, не полным путем к нему и altrough, который я не знаю, происходит ли его обязательное или нет, это название перенесенное в " не '. Кроме того, Ваше последнее ' отсутствует.

Content-Disposition: inline подразумевает, что файл должен быть отображен, не загружен. Используйте attachment вместо этого.

, Кроме того, сделайте расширение файла в верхнем регистре для создания этого совместимым с некоторыми мобильными устройствами.

Все, что, будучи сказанным, Ваш код должен больше походить на это:

<?php

    $filename = './pdf/jobs/pdffile.pdf';

    $fileinfo = pathinfo($filename);
    $sendname = $fileinfo['filename'] . '.' . strtoupper($fileinfo['extension']);

    header('Content-Type: application/pdf');
    header("Content-Disposition: attachment; filename=\"$sendname\"");
    header('Content-Length: ' . filesize($filename));
    readfile($filename);

Content-Length является дополнительным, но является также важным, если Вы хотите, чтобы пользователь смог отслеживать загрузку, прогрессируют и обнаруживают, если загрузка была прервана. Но при использовании его необходимо удостовериться, что Вы не будете, отправляют что-либо наряду с данными файла. Удостоверьтесь, что нет абсолютно ничего прежде <?php или после ?>, даже пустая строка.

6
ответ дан 31 October 2019 в 13:32

У меня недавно была та же проблема, и это помогло мне:

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="FILENAME"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize("PATH/TO/FILE")); 
    ob_clean(); 
    flush(); 
    readfile(PATH/TO/FILE);      
    exit();

я нашел этот ответ здесь

3
ответ дан 31 October 2019 в 13:32

Можно ли попробовать, этому, readfile нужен полный путь к файлу.

        $filename='/pdf/jobs/pdffile.pdf';            
        $url_download = BASE_URL . RELATIVE_PATH . $filename;            

        //header("Content-type:application/pdf");   
        header("Content-type: application/octet-stream");                       
        header("Content-Disposition:inline;filename='".basename($filename)."'");            
        header('Content-Length: ' . filesize($filename));
        header("Cache-control: private"); //use this to open files directly                     
        readfile($filename);
1
ответ дан 31 October 2019 в 13:32

Необходимо определить размер файла...

header('Content-Length: ' . filesize($file));

И эта строка является неправильным:

заголовок ("Содержание-Disposition:inline; имя файла =' $filename");

Вы испортили квоты.

0
ответ дан 31 October 2019 в 13:32

Другие вопросы по тегам:

Похожие вопросы: