Я действительно пытаюсь заставить мое приложение открыть 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");
это, похоже, не работает, кто-нибудь успешно разбирал эту проблему в прошлом?
Пример 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"); ?> <html> <body> ... ...
Также помните, что,
Важно заметить, что 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 MYH:i:s').' GMT'); echo $content;
В вашем коде есть некоторые вещи.
Во-первых, правильно напишите эти заголовки. Вы никогда не увидите ни одного сервера, отправляющего Content-type:application/pdf
, заголовок Content-Type: application/pdf
, spaced, с заглавными буквами и т. Д.
Имя файла в 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-Length: ' . filesize($file));
И эта строка неверна:
заголовок ( "Content-Disposition: встроенный; имя файла = '$ имя_файла");
Вы испортили квоты.