Загрузка PDF не работает должным образом - PullRequest
1 голос
/ 23 декабря 2009

Я использую следующий код для загрузки PDF ....

   header('Content-Type: application/pdf');
   header('Content-Disposition: attachment; filename="NewName.pdf"');
   readfile($root_path.'/full-tile-book.pdf');

Это файл размером 13 МБ, который загружается только как 130 КБ и, конечно, не может быть открыт. Как мне отладить, в чем проблема? Мой путь к PDF правильный.

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

Возможно, вы столкнулись с ошибкой памяти / размера файла? В прошлом у меня были проблемы с выгрузкой больших файлов с помощью readfile. В дополнение к настройке заголовка Content-Length, я рекомендую использовать fpassthru(), поскольку он не считывает файл в буфер, он просто выгружает его.

set_time_limit(0); // disable timeout
$file = $root_path.'/full-tile-book.pdf';
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="NewName.pdf"');
header('Content-Length: ' . filesize($file));
session_write_close(); // remove this line if sessions are not active
$f = fopen($file, 'rb');
fpassthru($f);
fclose($f);
exit;

РЕДАКТИРОВАТЬ: Если вы используете какой-либо сессионный_код, рекомендуется завершить сеанс до начала процесса дампа файла. Я обновил свой пример, чтобы отразить это.

0 голосов
/ 23 декабря 2009

см. Загруженный файл, возможно, неправильно использует адрес в PHP.
Вы можете следовать этому руководству для загрузки файлов на PHP.

Заголовки HTML должны быть отправлены до вывод отправляется в браузер. PHP использует функцию заголовка для передачи raw HTML-заголовки. Для этого примера мы собираюсь получить имя файла из URL www.yourdomain.com/download.php?file=download.zip.

<? 
$dir="/path/to/file/";
if (isset($_REQUEST["file"])) {
    $file=$dir.$_REQUEST["file"];
    header("Content-type: application/force-download");
    header("Content-Transfer-Encoding: Binary");
    header("Content-length: ".filesize($file));
    header("Content-disposition: attachment; filename="".basename($file).""");
    readfile("$file");
} else {
    echo "No file selected";
}
 ?>

Мы начали с настройки каталога где файлы для скачивания находится в $ dir. Будьте уверены, чтобы не использовать в $ Реж. Затем мы проверили, чтобы убедиться, имя файла было указано в запросе. Если файл был указан, то мы устанавливаем $ file к пути к файлу и имя файла. Теперь, когда подготовительная работа сделал время, чтобы отправить файл в браузер.

Первый оператор заголовка сообщает браузер ожидает загрузки. Следующий два оператора заголовка сообщают браузеру формат данных и размер файл соответственно. Последний заголовок Заявление сообщает браузеру имя файла. Наконец, файл для чтения оператор отправляет файл в браузер.

Дополнительная информация.

0 голосов
/ 23 декабря 2009

Я бы добавил несколько предметов. Присвойте имя файла $ file, затем попробуйте:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...