Korrekte PHP-Header für den Download von PDF-Dateien

Lesezeit: 5 Minuten

Korrekte PHP Header fur den Download von PDF Dateien
Benutze auch deine Illusion

Ich habe wirklich Mühe, meine Anwendung dazu zu bringen, ein PDF zu öffnen, wenn der Benutzer auf einen Link klickt.

Bisher leitet das Anchor-Tag 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?

  • Tippfehler? Versuchen Sie, a hinzuzufügen ' $filename='./pdf/jobs/pdffile.pdf'; und in dieser Zeile header("Content-Disposition:inline;filename='$filename"); fehlendes Anführungszeichen.

    – Funk Forty-Niner

    19. November 2013 um 19:29 Uhr


  • Wie/warum verwenden Sie $url_download ?

    – Funk Forty-Niner

    19. November 2013 um 19:43 Uhr


1646262846 706 Korrekte PHP Header fur den Download von PDF Dateien
gat

Beispiel 2 weiter w3schools zeigt, was Sie erreichen wollen.

<?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");
?>

Denken Sie auch daran,

Es ist wichtig zu beachten, dass header() aufgerufen werden muss, bevor eine tatsächliche Ausgabe gesendet wird (in PHP 4 und höher können Sie die Ausgabepufferung verwenden, um dieses Problem zu lösen).

  • Haha, wahr. Ich habe es nur erwähnt, weil es dasselbe Beispiel hatte.

    – gat

    19. November 2013 um 19:34 Uhr

  • Plus 1 für den Ausgangshinweis.

    – iamdash

    20. August 2014 um 16:46 Uhr

  • Denken Sie daran, die einfachen Anführungszeichen um den Dateinamen zu entfernen. Wenn Sie filename=’heruntergeladen.pdf’ verwenden, versuchen einige Browser, die Datei mit den Anführungszeichen im Dateinamen zu speichern. Ich habe das kürzlich unter OSX erlebt.

    – mattis

    2. Juni 2016 um 18:24 Uhr

  • readfile() Sehr schlecht für große Dateien, denn wenn einige Benutzer herunterladen möchten, puffern alle heruntergeladenen Dateien im Server-RAM !!!

    – mghhgm

    8. August 2017 um 8:58 Uhr

  • Warum um alles in der Welt sollte ein PDF HTML-Tags haben?

    – delboy1978uk

    14. März 2018 um 14:21 Uhr

Korrekte PHP Header fur den Download von PDF Dateien
Marin Vartan

$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;

  • Beachten Sie, dass das Laden des gesamten Dateiinhalts in eine Variable mit dem Speicherlimit kollidieren kann. Deshalb readfile() ist die bevorzugte Lösung.

    – Havenar

    24. November 2019 um 21:18 Uhr

  • Ich hatte ein Problem im Edge-Browser, der PDF nicht erkennen konnte, dieser Code behebt es. Danke !!!!

    – Jimit Shah

    11. August 2021 um 6:22 Uhr

Korrekte PHP Header fur den Download von PDF Dateien
Hafen

Es gibt einige Dinge, die in Ihrem Code berücksichtigt werden müssen.

Schreiben Sie zuerst diese Header richtig. Sie werden niemals sehen, dass ein Server sendet Content-type:application/pdfdie Kopfzeile ist Content-Type: application/pdfmit Abstand, mit großen Anfangsbuchstaben usw.

Der Dateiname im Content-Disposition ist nur der Dateiname, nicht der vollständige Pfad dazu, und obwohl ich nicht weiß, ob es obligatorisch ist oder nicht, wird dieser Name eingeschlossen " nicht '. Auch deine letzte ' wird vermisst.

Content-Disposition: inline impliziert, dass die Datei angezeigt und nicht heruntergeladen werden soll. Verwenden attachment stattdessen.

Machen Sie außerdem die Dateierweiterung in Großbuchstaben, um sie mit einigen Mobilgeräten kompatibel zu machen. (Aktualisieren: Ich bin mir ziemlich sicher, dass nur Blackberries dieses Problem hatten, aber die Welt hat sich von diesen entfernt, sodass 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 Sie möchten, dass der Benutzer den Fortschritt des Downloads verfolgen und erkennen kann, ob der Download unterbrochen wurde. Aber wenn Sie es verwenden, müssen Sie sicherstellen, dass Sie nichts zusammen mit den Dateidaten senden. Stellen Sie sicher, dass vorher absolut nichts vorhanden ist <?php oder danach ?>nicht einmal eine leere Zeile.

  • Sie brauchen das schließende Tag nicht ?>. In diesem Fall ist es besser, es zu entfernen.

    – Marcel Korpel

    20. November 2013 um 14:28 Uhr

  • Ziemlich sicher, dass das Einschließen eines Header-gelieferten Dateinamens in einfache Anführungszeichen das Herunterladen umfassend unterbricht, also macht das, wie Sie vorschlagen, einen großen Unterschied.

    – Brian C

    24. November 2019 um 8:05 Uhr

Ich hatte vor kurzem 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 gefunden Hier

Kannst du das versuchen, readfile benötigen 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);

1646262848 609 Korrekte PHP Header fur den Download von PDF Dateien
Azad-Bildung

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);

1646262848 934 Korrekte PHP Header fur den Download von PDF Dateien
Blitz Donner

Sie müssen die Größe der Datei definieren …

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

Und diese Zeile ist falsch:

header(“Content-Disposition:inline;filename=”$filename”);

Du hast Quoten vermasselt.

  • Nein, Sie müssen die Größe der Datei nicht angeben. Das ist auch eine mögliche Fehlerquelle.

    – Marcel Korpel

    19. November 2013 um 19:31 Uhr


  • Abhängig von der Version des PDF-Plugins. Es ist sicher, es zu geben.

    – Blitz Donner

    19. November 2013 um 19:35 Uhr

  • kann das nicht zum Laufen bringen. Was ist die $file-Variable, deren Größe ich teste? Ist es die Datei-URL ./pdf/jobs/pdftitle.pdf ?

    – nutze auch deine Illusion

    19. November 2013 um 19:39 Uhr

  • Ja, es ist der Dateispeicherort … vielleicht vermasseln Sie Pfade? versuchen Sie, den absoluten Pfad anzugeben.

    – Blitz Donner

    19. November 2013 um 19:40 Uhr

917140cookie-checkKorrekte PHP-Header für den Download von PDF-Dateien

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy