Ich habe wirklich Probleme damit, dass meine Anwendung ein PDF öffnet, wenn der Benutzer auf einen Link klickt.
Bisher leitet das Ankertag zu einer Seite weiter, die folgende Header sendet:
$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");
Das scheint nicht zu funktionieren. Hat jemand dieses Problem in der Vergangenheit erfolgreich gelöst?
'
$filename='./pdf/jobs/pdffile.pdf';
und in dieser Zeileheader("Content-Disposition:inline;filename='$filename");
fehlendes Anführungszeichen hinzuzufügen .$url_download
?Antworten:
Beispiel 2 auf w3schools zeigt, was Sie erreichen möchten .
Denken Sie auch daran,
quelle
readfile()
Sehr schlecht für große Dateien, denn wenn einige Benutzer herunterladen möchten, puffern alle heruntergeladenen Dateien auf dem Server-RAM !!!$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;
quelle
readfile()
ist die bevorzugte Lösung.In Ihrem Code sind einige Dinge zu beachten.
Schreiben Sie zuerst diese Überschriften richtig. Sie werden niemals einen Server senden sehen
Content-type:application/pdf
, der Header istContent-Type: application/pdf
in Abständen mit großgeschriebenen Anfangsbuchstaben usw.Der Dateiname in
Content-Disposition
ist nur der Dateiname, nicht der vollständige Pfad dazu, und obwohl ich nicht weiß, ob er obligatorisch ist oder nicht, wird dieser Name"
nicht eingepackt'
. Auch dein letzter'
fehlt.Content-Disposition: inline
impliziert, dass die Datei angezeigt und nicht heruntergeladen werden soll. Verwenden Sieattachment
stattdessen.Stellen Sie außerdem die Dateierweiterung in Großbuchstaben ein, damit sie mit einigen Mobilgeräten kompatibel ist. ( Update : Ich bin mir ziemlich sicher, dass nur Brombeeren dieses Problem hatten, aber die Welt hat sich von diesen entfernt, so dass dies möglicherweise kein Problem mehr darstellt.)
Abgesehen davon sollte Ihr Code eher so aussehen:
<?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
ist optional, aber auch wichtig, wenn der Benutzer den Download-Fortschritt verfolgen und feststellen soll, ob der Download unterbrochen wurde. Wenn Sie es verwenden, müssen Sie jedoch sicherstellen, dass Sie nichts zusammen mit den Dateidaten senden. Stellen Sie sicher, dass vorher<?php
oder nachher absolut nichts ist?>
, nicht einmal eine leere Zeile.quelle
?>
. In diesem Fall ist es besser, es zu entfernen.Ich hatte kürzlich das gleiche Problem und das hat mir geholfen:
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();
Ich habe diese Antwort hier gefunden
quelle
Können Sie dies versuchen,
readfile
benötigen Sie den vollständigen Dateipfad.$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);
quelle
Sie müssen die Größe der Datei definieren ...
header('Content-Length: ' . filesize($file));
Und diese Zeile ist falsch:
Sie haben Quoten durcheinander gebracht.
quelle