PHP PDF-Download mit PHP

Cumulonimbus

Lt. Junior Grade
Registriert
Feb. 2007
Beiträge
303
Hallo,

ich bekomme bald n Kasper.


Mit folgendem Code will ich einen Download einer DPF-Datei erreichen.

PHP:
<?php
$filename = '1.pdf';
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-disposition: attachment; filename='.basename($filename));
header('Content-Type: application/pdf');
header('Content-type: application/octet-stream' );
header('Content-Transfer-Encoding: binary');
header('Content-Length: '. filesize($filename));
readfile($filename);
?>

Der Browser öffnet auch und startet, doch er lädt erst nach einigen Sekunden "irgendwas". Die Datei hat dann 37.5KB und ist kaputt.

Ich hab keinen Plan wo der Fehler ist. Hilfe.

Gruß und Dank,
Cb
 
Mh, du brauchst gar nich so viele Headerausgaben, und basename() brauchste auch nicht. Ich hab mal eine zusätzliche Variable reingesetzt um dir auch die Möglichkeit einzuräumen die PDF aus einem anderen Ordner laden zu lassen.

PHP:
<?php
$filepath = "download/";
$filename = "1.pdf";
header('Content-disposition: attachment; filename='.$filename);
header('Content-type: application/octet-stream' );
header('Content-Length: '. filesize($filepath.$filename));
readfile($filepath.$filename);
exit;
?>

Je nach zu erwaratender Downloadzeit solltest du auch überlegen via ini_set() die "max_execution_time" hochzusetzen. Außerdem wärs denk ich nicht dumm, wenn man error_reporting(0); setzt, um eine eventuelle Fehlerausgabe zu unterdrücken.

Und, was ganz wichtig ist: Du darfst VOR der Header-Ausgabe keinerlei Textausgaben haben, das führt zu Fehlern.
 
Vielen Dank mal soweit, aber das klappt leider auch nicht. Hier das Resultat.
Zumindest stimmt jetzt die Dateigröße die runtergeladen wird.

zwischenablage-1kl38.jpg


Edit: Es gibt was neues!

Ich hab mal spaßhalber die PDF mit'm Editor geöffnet. Da wurde meine Webseite reingeschrieben ins
PDF.

Edit: Ich hab dieses Schnippsel Code als index.php zusammen mit der PDF auf ne leere Webseite geschmissen. Selbes Resultat :-(
 
Zuletzt bearbeitet:
Hm, da würd ich sagen stimmt dann irgendwas mit den Pfaden nicht oder ein anderes Script leitet die Anfrage an die Datei auf deine Website um (z.B. eine .htaccess). Schmeiss mal testweise das Downloadscript und die dazu gehörige PDF in einen anderen Ordner und führ des da dann mal aus.

//Edit

poste mal bitte alle Scripte komplett, die du für dein Vorhaben nutzt, ggf. halt gezippt wenns zu viel ist. Generierst du die PDF irgendwie mit nem andren Script oder so? Oder wie sollte die PDF tatsächlich aussehen?
 
Zuletzt bearbeitet:
TchiboMann schrieb:
Hm, da würd ich sagen stimmt dann irgendwas mit den Pfaden nicht oder ein anderes Script leitet die Anfrage an die Datei auf deine Website um (z.B. eine .htaccess). Schmeiss mal testweise das Downloadscript und die dazu gehörige PDF in einen anderen Ordner und führ des da dann mal aus.

//Edit

poste mal bitte alle Scripte komplett, die du für dein Vorhaben nutzt, ggf. halt gezippt wenns zu viel ist. Generierst du die PDF irgendwie mit nem andren Script oder so? Oder wie sollte die PDF tatsächlich aussehen?

Ich hänge fest, denn es liegt wohl am eingesetzten CMS-System. Wenn ich an einer beliebigen Stelle von der Webseite den Download auslöse, wird die Webseite in die PDF-Datei gepackt und deswegen wird das nix. Das ist ja kurios.

Ich muss aber über das CMS gehen, denn die Kunden-Berechtigungen werden über das CMS gesteuert, siehe im Post. Ich bin momentan auch am überlegen, wie ich den Download des PDF's auslösen will. Per Button, per Link, oder wie??? Viele Fragen, wenig Ahnung. Ich sollt n PHP-Coder engagieren.

Gruß,
Cb
Ergänzung ()

TchiboMann schrieb:
Hm, da würd ich sagen stimmt dann irgendwas mit den Pfaden nicht oder ein anderes Script leitet die Anfrage an die Datei auf deine Website um (z.B. eine .htaccess). Schmeiss mal testweise das Downloadscript und die dazu gehörige PDF in einen anderen Ordner und führ des da dann mal aus.

//Edit

poste mal bitte alle Scripte komplett, die du für dein Vorhaben nutzt, ggf. halt gezippt wenns zu viel ist. Generierst du die PDF irgendwie mit nem andren Script oder so? Oder wie sollte die PDF tatsächlich aussehen?

Hab ich schon gemacht. Den obigen Codeschnippsel und die PDF lose auf ne leere Domain gelegt. Da klappt das. Sobald ich es im CMS einsetze, passiert diese Miste. Das sind ganz normale PDF's, kaum 100Kb groß, eher weniger.


Edit:

Hier die htaccess
PHP:
<FilesMatch "\.(cfg|class|inc|mod|lng|tpl|htaccess)$">
order deny,allow
deny from all
</FilesMatch>

<IfModule mod_headers.c>

<FilesMatch "\.(ico|pdf|flv)$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>

<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

<FilesMatch "\.(xml|txt|css|js)$">
Header set Cache-Control "max-age=172800, proxy-revalidate"
</FilesMatch>

</IfModule>

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/xhtml+xml application/javascript application/x-javascript
SetEnvIfNoCase REQUEST_URI \.(?:gif|jpg|jpeg|png|svg)$ no-gzip dont_vary
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

ErrorDocument 404 index.php
ErrorDocument 403 index.php
ErrorDocument 500 index.php
Ergänzung ()

So, nach 7 Stunden hat es endlich geklappt und auch der geschützte Download klappt :-))

Was habe ich gemacht?

PHP:
<?php
$filepath = "/downloads/";
$filename = "1";
header('Content-disposition: attachment; filename='.$filename);
header('Content-type: application/octet-stream' );
header('Content-Length: '. filesize($filepath.$filename));
readfile($filepath.$filename);
exit;
?>

Dieser Codeschnippek liegt als download.php in einem geschützten Ordner.

Aufgrufen wird der Code mit:

PHP:
<form action="/geschuetzter_ordner/download.php" method="post">
<input class="button" type="submit" value="pdf" style="width:35px;background-color:green;color:white;border:1px solid grey;font-size:9px;"> </form>

So, damit kann der Download des PDF's ausgelöst werden. Wenn jemand den Download-Pfad untersucht, berkommt er den Pfad in das geschützte Verzeichnis
angezeigt. Will er die php auswählen, schlägt das fehl da er auf die Datei ja nicht
zugreifen kann. Gibt es Sicherheitsbedenken bei der Vorgehensweise?

Gruß,
Cb
Ergänzung ()

Und schon das nächste Problem.

Mit dem Browser auf dem Android Handy kann ich die PDF's nicht runterlanden. "Der Download war nicht erfolgreich". Auch der Standardbrowser will das PDF nicht runterladen.
 
Zuletzt bearbeitet:
Code:
ErrorDocument 404 index.php 
ErrorDocument 403 index.php 
ErrorDocument 500 index.php

Kann sein, dass die PDF ggf. schreib/zugriffsgeschützt war? Auf Linux gibts ja das Problem mit den CHMOD-Rechten. Wenn die Datei keine richtigen Rechte hat, dann kann auch PHP nicht auf die PDF zugreifen und gibt dann ein Error 403 aus, und in deiner htaccess wird das Script dann auf die index.php umgeleitet. Wär eine Erklärung dafür, denk ich mal...

Aber wenn das so funktioniert es grad funktioniert... Würd ichs ggf. so lassen. Ob das da nu ne Sicherheitslücke ist kann ich nicht beurteilen, kenn ja dein CMS nicht und auch nicht, welchem Zweck die PDF dann dienen soll. Wenns ne Rechnung ist, dann würd ich vll schon sagen, dass es ne Sicherheitslücke sein könnte, wenn in der download.php keinerlei Zugriffsrechte eingetragen sind.
 
TchiboMann schrieb:
Code:
ErrorDocument 404 index.php 
ErrorDocument 403 index.php 
ErrorDocument 500 index.php

Kann sein, dass die PDF ggf. schreib/zugriffsgeschützt war? Auf Linux gibts ja das Problem mit den CHMOD-Rechten. Wenn die Datei keine richtigen Rechte hat, dann kann auch PHP nicht auf die PDF zugreifen und gibt dann ein Error 403 aus, und in deiner htaccess wird das Script dann auf die index.php umgeleitet. Wär eine Erklärung dafür, denk ich mal...

Aber wenn das so funktioniert es grad funktioniert... Würd ichs ggf. so lassen. Ob das da nu ne Sicherheitslücke ist kann ich nicht beurteilen, kenn ja dein CMS nicht und auch nicht, welchem Zweck die PDF dann dienen soll. Wenns ne Rechnung ist, dann würd ich vll schon sagen, dass es ne Sicherheitslücke sein könnte, wenn in der download.php keinerlei Zugriffsrechte eingetragen sind.

Hallo,

ich muss die genauen Pfade vom Server verwenden, sonst passiert das so wie
geschehen.

Jetzt klappt zumindest der Download mit den gängigen Browsern vom Desktop. Allerdings gehen die Downloads nicht auf allen möglichen Mobil-Browsern, wenn der Download mit PHP angestoßen wird. Es scheint am fopen zu liegen. Gibt es nicht da doch ne Problemlösung für?

Wenn die PDF's direkt per Link aufgerufen werden lassen sie sich korrekt herunterladen. Es scheint am fopen oder irgendwelchen Headern zu liegen
 
Zuletzt bearbeitet:
Jor da würd ich sagen liegts an den Headern, wobei des eigentlich theoretisch auch egal ist... Wundert mich, dasses bei den Mobilbrowsern zickt. Wobei ich dann da auch eher die Schuld an den Mobilbrowsern suchen würde...

Du könntest vll versuchen statt des Octet-Stream den anderen, den PDF-Header zu nehmen und das dann mal zu testen.

Ist des denn zwingend notwendig? Weil, PDF und Mobil... Weiß nich.
 
TchiboMann schrieb:
Jor da würd ich sagen liegts an den Headern, wobei des eigentlich theoretisch auch egal ist... Wundert mich, dasses bei den Mobilbrowsern zickt. Wobei ich dann da auch eher die Schuld an den Mobilbrowsern suchen würde...

Du könntest vll versuchen statt des Octet-Stream den anderen, den PDF-Header zu nehmen und das dann mal zu testen.

Ist des denn zwingend notwendig? Weil, PDF und Mobil... Weiß nich.

Hallo,

eigentlich sollte das mit dem PDF schon auch gehen. Ich stelle Abo-Produkte 2x täglich zum Abruf bereit. Einmal HTML, einmal PDF und immer öfter wird von den Abonnenten auch der mobile, uneingeschränkte Zugang gefordert. Dieser Weg ist mein Ziel.

Der Download funktioniert übrigens nicht mit: Opera Mini, Dolphin Browser, Standardbrowser
 
Dann musste mal mit den Headern herumspielen und mal im Web suchen, wie ganz genau die Auslieferung von Downloads funktioniert. Bisher hab ich immer nur mit den Headern oben gearbeitet, was halt wunderbar so funktioniert.

Wie des bei den Mobilen Browsern ist weiß ich eben leider nicht, allerdings weiß ich dass Opera Mini auch gerne Probleme mit üblichen Javascripten hat. Von daher würd ich einen Bug da auch nicht ausschließen. Dolphin Browser kenn ich z.B. mal gar nicht^^

Musste mal bei Google recherchieren ;)
 
TchiboMann schrieb:
Dann musste mal mit den Headern herumspielen und mal im Web suchen, wie ganz genau die Auslieferung von Downloads funktioniert. Bisher hab ich immer nur mit den Headern oben gearbeitet, was halt wunderbar so funktioniert.

Wie des bei den Mobilen Browsern ist weiß ich eben leider nicht, allerdings weiß ich dass Opera Mini auch gerne Probleme mit üblichen Javascripten hat. Von daher würd ich einen Bug da auch nicht ausschließen. Dolphin Browser kenn ich z.B. mal gar nicht^^

Musste mal bei Google recherchieren ;)

Da ist es ab und an gescheiter, eine konkrete Frage gleich ins Netz&Forum zu stellen, denn entweder es gibt tausende Halbwahrheiten oder man stellt nach 10 Stunden fest dass man keinen Schritt weitergekommen ist, wie letzte Nacht. :-(

Also auf zur nächsten Nachtschicht. :-)

edit: Mit Firefox 4.0b1 für Android kann das PDF einwandfrei geladen werden. :-)
 
Zuletzt bearbeitet:
Zurück
Oben