Include bei Binärdateien

Wenn ich den Skribt einer PHP-Datei (z.B: mysql_connect.php) in einer anderen Datei verwenden will, nehme ich den befehl ‚include‘

Mit:

include(GET_[‚url‘]);
?>

kann man andere ACII Dateien Simulieren. z.B.: ‚start.php?url=Gaestebuch.php‘
Wie sieht das mit Binärdateien aus. Mit bildern is das ja kein Problem.
Aber ‚start.php?url=Meinedatei.pdf‘ gibt ein Zeichen-wirrwar aus.
Öffnet man die selbe datei mit den Acrobat reader, sieht man aber das erwartete PDF Dokument- nur im Browser klappts halt nicht.
Ich habe auch probiert, einen unterordner anzulegen, in dem PDF Skribte mit dem PHP Interpreter geladen werden (.htaccess geändert). Heraus kam das selbe Bild.
‚test.pdf?url=meinepdf.pdf‘ wird vom Browser nich als Pdf datei behandelt/erkannt. Es erscheint das Zeichen-wirrwar im Browser. Mit dem Acrobat Reader ist die Ansich normal/wie gewünscht.

das Zauberwort heisst header
bei allen textbasierten dateien funktioniert das sicherlich. Sobald es aber spezielle Dateiheader braucht versagt das ganze. Wenn Du je nach Inhalt einen pdf oder Bildheader davorsetzt dann sollte das auch wieder funktionieren.

header- aber wie?
und wie setze ich so einen Header davor? Bilddateien ist klar. Aber wie macht mann das bei PDF, Word(.doc), Powerpoint, mp3 und co ???

und wie setze ich so einen Header davor? Bilddateien ist klar.
Aber wie macht mann das bei PDF, Word(.doc), Powerpoint, mp3
und co ???

Hi Tom,

versuch mal folgendes:

<?php $file = "test.pdf";//$_GET["url"];<br /> $f = fopen($file, 'rb') or die("Angeforderte PDF-Datei nicht gefunden.");
 $pdf = fread($f, filesize ($file));
 fclose ($f);
 header("Content-type: application/pdf");
 echo $pdf;
?\>

Aber sowas funktioniert auf keinen Fall:

<?php header("Content-type: application/pdf");<br /> include "test.pdf"
?\>

Gruß,
Rudy

Aber sowas funktioniert auf keinen Fall:

<?php : header("Content-type: application/pdf");
include "test.pdf" ?\>

und warum nciht?

Weil der PHP-Parser beim Aufruf von Include in den HTML-Modus schaltet, und HTML-Dateien werden standardmäßig Ascii-geparst, nicht binär. Deshalb muss auch PHP-Code in den Includes mit <?php ?> versehen werden, damit er verarbeitet wird. Würde der Parser das anders handhaben, reichte einfacher Code ohne Start- und Endtags. Ob es da einen PHP-Einstellung gibt, entzieht sich meiner Kenntnis. Ich habe auch schon einige PDF-Dateien online stellen müssen, und habe anfangs eine PHP-Datei erstellt, welche mit das PDF mit dem übergebenen Dateinamen ausliest a la

<?php include "http ://www.meindomain.com/readpdf.php?file=test.pdf";<br />?\>

, wobei readpdf.php dann den header samt Datei ausgibt. Bei einigen, kurzen PDFs hat das funktioniert, seltsamerweise kam bei längeren komplizierteren PDFs ein „Unexpected T_STRING in Line…“ wobei die Zeile, in der der Fehler auftrat, außerhalb des Code-Bereichs lag, die Zeile gabs nicht mal. Auch den Header in die index.php, also die Datei, welche das Include vollzieht, zu setzen, hat nix gebracht. So habe ich mich entschlossen, direkt auf die URL zu verweisen, anstatt ein Include zu nehmen, die unsaubere Lösung wäre ein (I-)Frame zu verwenden. Ich habe mich anstatt der include-Methode dann für

<?php header("Location:http ://www.meindomain.com/readpdf.php?file=test.pdf");<br />?\>

entschlossen, und das funktioniert wunderbar. Eine Alternative wäre das PDF-Objekt, mit dem habe ich aber noch keine Erfahrungen gesammelt. http://it2.php.net/manual/en/ref.pdf.php Das direkte Include hat jedenfalls noch nie funktioniert, auch nicht mit einfachen PDFs, da mault der Browser, dass die Datein nicht mit %PDF- beginnt. Hast Du hierfür etwa eine Lösung? Die könnte ich nämlich auch gebrauchen.

Gruß,
Rudy

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Aber sowas funktioniert auf keinen Fall:

<?php ::: header("Content-type: application/pdf");
include "test.pdf" ?\>

und warum nciht?

Weil der PHP-Parser beim Aufruf von Include in den HTML-Modus
schaltet, und HTML-Dateien werden standardmäßig Ascii-geparst,
nicht binär.

ok, halten wir fest: es ist unsauber und arbeitet wahrscheinlich instabil - prinzipiell geht es, solange keine php-tags drin sind … :wink:
zu deiner loesung:

> <?php : $file = "test.pdf";//$_GET["url"];<br /> $f = fopen($file, 'rb') or die("Angeforderte PDF-Datei nicht gefunden.");  
> $pdf = fread($f, filesize ($file));  
> fclose ($f);  
> header("Content-type: application/pdf");  
> echo $pdf;  
> ?\>


besser, weil weniger speicher - readfile sollte auch binary safe sein:


    
    <?php header("Content-type: application/pdf");<br />readfile ( $file );
    ?\>

Hallo,

Weil der PHP-Parser beim Aufruf von Include in den HTML-Modus
schaltet, und HTML-Dateien werden standardmäßig Ascii-geparst,
nicht binär.

ich weiß zwar von php nicht viel, aber PDF ist Ascii :wink: - kann ja jeder mal mit Notepad öffnen, die Tags kann man gut lesen, das Base64 Encodierte ist schon „etwas“ schwerer im Kopf :smiley:

Aber soweit ich mich noch an PHP erinnern kann, könnte doch sowas funktionieren:

header("Content-Type: application/pdf"); // Steht im Anderen Artikel glaub das richtige
$datei = file\_get\_contents("blah.pdf");
echo $datei;
?\>

bye,
Christoph

Hallo,

Weil der PHP-Parser beim Aufruf von Include in den HTML-Modus
schaltet, und HTML-Dateien werden standardmäßig Ascii-geparst,
nicht binär.

ich weiß zwar von php nicht viel, aber PDF ist Ascii :wink: - kann
ja jeder mal mit Notepad öffnen, die Tags kann man gut lesen,
das Base64 Encodierte ist schon „etwas“ schwerer im Kopf :smiley:

Du hast Recht, PDF ist Postscript, das ist prinzipiell Ascii. Es muss allerdings immer mit einer Funktion eingelesen werden, welche binary-safe ist, weil sich der Parser bei PHP-Spezifischen Sonderzeichen im Quelltext des PDFs beklagt. Welche der Funktionen man auch verwenden will, Include ist ausgeschlossen. Dafür gibts dann wohl auch nix. Ich habe auch wie von dog.je angemerkt nach PHP-Tags in meiner Testdatei gesucht, welches sich nicht einbinden ließ, im Quelltext (angesehen mit Wordpad) wurde ich gleich in der 2.Zeile fündig: <?xpacket begin=’’ - das mochte er wohl nicht, da bei meinem PHP die Option „ShortOpenTags“ aktiviert ist. Direkt auf die Seite umzuleiten, welche das PDF samt header ausgibt, scheint also das einzig wirksame zu sein.

Aber soweit ich mich noch an PHP erinnern kann, könnte doch
sowas funktionieren:

header(„Content-Type: application/pdf“); // Steht im Anderen
Artikel glaub das richtige
$datei = file_get_contents(„blah.pdf“);
echo $datei;
?>

Prinzipiell des geht auch, die Funktion file_get_contents ist auch binary-safe. Allerdings nur sofern der PHP auf dem Server nicht Safe-Modus läuft, hängt also von der Konfiguration ab.

Gruß,
Rudy