2016-01-04 3 views
11

Wenn einen PDF im Browser zu erzeugen programmatisch (via PHP) das gerenderte PDF zeigt fein in Firefox und Safari, aber Chrome gibt einen ERR_INVALID_RESPONSE. Es ist ein gültiger PDF - kann lokal mit Adobe Reader/Preview einmal aus den Arbeits Browsern und sogar offen in Chrome, wenn die PDF-Datei wird von einem anderen Browser gespeichert gespeichert geöffnet werden.PDF-Generierung Ergebnisse in ERR_INVALID_RESPONSE in Chrome

Die PDF-Datei durch file_get_contents() gelesen wird, wird einen aktuellen Zeitstempel gegeben und dann an den Browser übergeben. Eine Abhilfe würde bedeuten, die Datei in einen temporären Stelle speichern und den Benutzer Umleitung (für Chrome, zumindest), aber dies ist nicht ideal.

Ich habe es erforscht und nur in der Lage gewesen bug reports dating from 2008 zu finden.

Ich habe eine Ahnung, es ist ein Header-Fehler. Nachdem das PDF erzeugt wird, werden die folgenden Header an den Browser gesendet (wieder arbeitet in FF Fein, Safari und IE):

header('Content-type:application/pdf'); 
    header("HTTP/1.1 200 OK"); 

ich auch versucht habe, nach der Suche auf Stack-Überlauf die folgenden Header hinzugefügt, sondern zu nein:

header("Content-Transfer-Encoding: binary"); 
    header('Accept-Ranges: bytes'); 

Gibt es fehlende Header, die Chrome benötigt? Hat jemand Erfahrung damit, dynamisch erzeugte PDFs in Chrome anzeigen zu lassen?

BEARBEITEN: Eine meiner wichtigsten Fragen ist, was dazu führen könnte, dass dies lokal in Chrome funktioniert, aber in einer Serverumgebung nicht funktionieren würde.

Vielen Dank im Voraus für jede Hilfe.

+0

Haben Sie versucht, die Neigung zur Befestigung zu ändern? header ('Content-Disposition: Anhang ;; Dateiname = "YourFileName"'); – HNA

+0

@HNA Ich habe - der gleiche Fehler ergibt sich in Chrome, ob mit Anhang oder nicht. Es gibt zwei Buttons: "save" (Speichern), der den 'header ('Content-Disposition: attachment;');'; so dass die Datei automatisch heruntergeladen wird (dies funktioniert lokal in Chrome, FF und Safari und funktioniert nicht lokal für Safari und Firefox). Die andere Schaltfläche, "Ansicht", zeigt nur die PDF-Datei an, ohne sie automatisch herunterzuladen. Derzeit arbeiten beide nicht in Chrome in einer nicht lokalen Instanz. –

+0

Senden Sie eine 'header ('Content-Length:'. Filesize ($ yourfile));'? – maxhb

Antwort

5

Ich möchte allen für ihre Antworten danken.

Es stellt sich heraus, dass dies nicht auf die Header bezogen war. Nachdem versucht wurde, Header auf verschiedene Arten zu ändern/zu entfernen (Erkennung von Encodierung, Ausprobieren mit und ohne Inhaltslänge, etc.), haben wir uns entschieden, in die tieferen httpd-Protokolle zu schauen, um zu sehen, ob irgendetwas für Chrome anders gelöst wurde.

Es stellt sich heraus, mod_sec auf unserem Server war die Anfrage (nur aus Chrome aus irgendeinem Grund) als Versuch einer Datei Injektion Angriff und war eine 403 verbotene Antwort zurück. Chrome zeigte dies als ERR_INVALID_RESPONSE anstelle von 403.

Der Hostname des CDN war in der Anfrage vorhanden (wir hatten reichlich Überprüfung am Endpunkt, um sicherzustellen, dass die Datei tatsächlich eine zulässige Ressource war), und stattdessen erstellen die URL stattdessen auf dem Server.

+0

Wie hast du es gelöst? Ich stehe mit demselben Problem fest. – Cyberdelphos

+0

Ich muss die Lösung für dieses Problem kennen, ich habe das gleiche Problem. Es ist in der Lage, Bilder anzuzeigen, wird aber nicht PDF anzeigen mit der ERR_INVALID_RESPNSE, die in Wirklichkeit 403 Fehler ist. – netrox

+0

@netrox Die Lösung ist mit der Antwort enthalten. Wir wurden wegen unserer CDN-URL (AmazonS3) in der Abfrage gefunden. Wir haben es aus der URL entfernt und dann am Endpunkt hinzugefügt. –

5

diese

<?php 
$filename = 'Physical Path to PDf file.pdf'; 
$content = file_get_contents($filename); 

header("Content-type:application/pdf"); 

// It will be called downloaded.pdf 
header("Content-Disposition:inline;filename='".basename($filename)."'"); 
header('Content-Length: '.strlen($content)); 

// The PDF source is in original.pdf 
readfile($filename); 
?> 

<html> 
<body> 
... 
... 
... 

Stellen Versuchen Sie sicher, dass über Header-Code vor der Ausgabe von PHP-Skript aufgerufen wird, wird an Browser gesendet.

+0

Vielen Dank für den Vorschlag. Ich habe diese Header ohne Glück versucht und erneut versucht. Ich habe die vollständige Liste der angehängten Header in einem Kommentar zur ursprünglichen Frage veröffentlicht. Beachten Sie auch, dass wir die Datei nicht wirklich in den Browser "lesen", sondern die PDF-Datei lesen, ändern und dann die neu erstellte Datei als Datei zum sofortigen Herunterladen oder im PDF-Viewer des Browsers bereitstellen (sie wird nicht gespeichert) während dieses Vorgangs zu jedem Zeitpunkt auf die Festplatte kopieren). –

6

In meinem Fall habe ich zu hatte fügen Sie diese 2 Parameter Header weil Wordpress 404 Code sendet wurde, da es nicht die URL meiner PHP-Funktion erkannte:

header("Content-type: application/pdf",true,200); 

wie in diesem answer on wordpress.stackexchange angegeben.

Dies zwingt die Header (2. param true) zu ersetzen, die 404 Code-Status von Wordpress erzeugt, da es nicht die benutzerdefinierte URL erkennt und setzt 200 OK (3. param 200).

So endet es so etwas wie dies zu sein:

$pdf_name = "test.pdf"; 
$pdf_file = "/absolute/path/to/my/pdfs/on/my/server/{$pdf_name}"; 
header('Content-type: application/pdf',true,200); 
header("Content-Disposition: attachment; filename={$pdf_name}"); 
header('Cache-Control: public'); 
readfile($pdf_file); 
exit(); 
Verwandte Themen