Правильные заголовки 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");
похоже, это не работает, кто-нибудь успешно решал эту проблему в прошлом?
8 ответов
Пример 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"); ?>
Также помните, что
Важно отметить, что header() должна вызываться перед отправкой любого фактического вывода (в PHP 4 и более поздних версиях вы можете использовать буферизацию вывода для решения этой проблемы)
$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;
Есть некоторые вещи, которые следует учитывать в вашем коде.
Во-первых, правильно пишите эти заголовки. Вы никогда не увидите отправку сервера Content-type:application/pdf
заголовок Content-Type: application/pdf
через пробел с заглавными буквами и т. д.
Имя файла в Content-Disposition
только имя файла, а не полный путь к нему, и хотя я не знаю, является ли это обязательным или нет, это имя входит в "
не '
, Кроме того, ваш последний '
пропал, отсутствует.
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
или после ?>
, даже не пустая строка.
У меня недавно была такая же проблема, и это помогло мне:
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();
Я нашел этот ответ здесь
Можете ли вы попробовать это, 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);
header("Content-type:application/pdf");
// It will be called downloaded.pdf thats mean define file name would be show
header("Content-Disposition:attachment;filename= $fileName ");
// The PDF source is in original.pdf
readfile($file_url);
Просто посмотрите на эту ссылку: https://gist.github.com/ScottPhillips/3026050
<?php
header('Content-Type: application/pdf');
echo file_get_contents('filename.pdf');
?>
Вам нужно определить размер файла...
header('Content-Length: ' . filesize($file));
И эта строка неверна:
заголовок ("Content-Disposition: встроенный; имя файла ='$ имя_файла");
Вы испортили квоты.