erzwungener Dateidownload funktioniert nicht

ausHaus

Grünschnabel
Hallo,

ich versuche jetzt schon seit ca 3 Stunden verzweifelt ein php file zu schreiben, das einen Download startet. Die PHP Datei wird von einem Flash Film aufgerufen, ohne irgendwelche Variablen zu übergeben.

Ich hab mich schon mit unzähligen Vorschlägen probiert die google so ausspuckt. Aber keiner bringt das gewünschte Ergebnis. Die meisten gehen garnicht oder erzeugen einen Fehler, das der Header bereits übergeben wurde () Ich bin ein Anfänger in Sachen PHP, aber dachte eigentlich das ich mit 3 kleinen Zeilen fertig werden müsste. Immerhin hab ich bereits ein Mailformular auf die Beine gestellt. Nun ja, nach 3 Stunden glaub ich das aber nicht mehr :-(

Ich will eine PDF zum Download anbieten. Diese soll sich aber nicht im Fenster öffnen sondern direkt als Downloadfenster kommen. Der Flash Film, die PHP, und auch die PDF liegen im selben Verzeichnis auf dem Server.

So sieht sie bis jetzt aus:

PHP:
<?php

header("Content-Type: application/force-download NAME=meineDatei.pdf");
header("Content-Disposition: attachment; filename=meineDatei.pdf");

readfile("meineDatei.pdf");

?>

Immerhin funktioniert es soweit, das das neue Fenster geöffnet wird mit dem Dialogfenster: Öffnen, Speichern, Abbrechen

Wenn ich dann aber auf Speichern klicke, kommt nix mehr. Das Dialogfenster verschwindet und im neuen Fenster steht nur noch "Aktion abgebrochen, bla bla bla"

Ist das evlt nur ein Fehler mit dem Pfad? Wie gesagt liegen alle Files in einem Ordner. Ich hab auch schon bei readfile den vollen Pfad mit http://w......./meineDatei.pdf probiert. Geht auch nicht? Evtl bring ich da ja was durcheinander. Muss ich evtl den selben Pfad angeben wie ich ihn mit ftp auf den Server sehe? Da habe ich dann folgenden Pfad: www/htdocs/meineDatei.pdf

wäre super wenn ihr mir helfen könnt. ich verzweifel langsam.
MfG ausHaus
 
Zuletzt bearbeitet:
Keine Ahnung ob das dein Problem löst.
Ich füge für solche dinge immer eine Ziele mehr hinzu....
PHP:
header("Content-Length: ".filesize($file));
 
Probier mal Folgendes:
PHP:
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=meineDatei.pdf");
header("Content-Length: ".filesize("meineDatei.pdf"));

readfile("meineDatei.pdf");
exit;
 
Danke erstmal für die schnellen Antworten.

Leider hats nix gebracht.Weder mit filesize noch mit octet-stream usw.

Ich habe aber etwas festgestellt. Wenn ich STRG gedrückt halte beim klick auf Speichern, dann kann ich die Datei downloaden. Allerdings ist das nicht meine PDF sondern sie beinhaltet eine Fehlermeldung. Jetzt glaub ich langsam das es irgendwas mit dem Pfad sein muss:

Code:
<br />
<b>Warning</b>:  filesize() [<a href='function.filesize'>function.filesize</a>]: Stat failed for meineDateipdf (errno=2 - No such file or directory) in <b>/WWWROOT/79414/htdocs/vv/download_pdf.php</b> on line <b>5</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /WWWROOT/79414/htdocs/vv/download_pdf.php:5) in <b>/WWWROOT/79414/htdocs/vv/download_pdf.php</b> on line <b>5</b><br />
<br />
<b>Warning</b>:  readfile() [<a href='function.readfile'>function.readfile</a>]: Unable to access /meineDatei.pdf/ in <b>/WWWROOT/79414/htdocs/vv/download_pdf.php</b> on line <b>6</b><br />
<br />
<b>Warning</b>:  readfile(/meineDatei.pdf/) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in <b>/WWWROOT/79414/htdocs/vv/download_pdf.php</b> on line <b>6</b><br />
 
tja dann solltest du wohl ne kontrollfunktion einfügen...
PHP:
if(file_exists(...)){....}
verwunderlich ist jedoch das deine aufgerufene datei *.pdf.php heißt, womöglich ist dein aufruf nur falsch oder du solletest einfach via $file = str_replace(".php", "", $file); ersetzen...
 
Hallo!
verwunderlich ist jedoch das deine aufgerufenedatei *.pdf.php heißt
Wo liest Du denn etwas von *.pdf.php?


Verwunderlicher ist eher "meineDateipdf", wo ist da der Punkt geblieben?
Ebenso verwunderlich ist "/meineDatei.pdf/", dieses deutet eher darauf hin dass ein Verzeichnisname angenommen wird.
Eindeutiger hingegen ist "No such file or directory", die Dateiund/oder das Verzeichnis existiert nicht bzw. kann nicht gefundenwerden.
Du solltest also nochmal den Pfad überprüfen (inkl. der Beachtung korrekter Gross-/Kleinschreibung).


Gruss Dr Dau
 
ups da hab ich zu der Zeit wohl leicht verlesen...
Aus sicherheitsgründen würde ich das ganze leicht ändern....

Für jede Datei wo leserechte vorhanden sind, besteht die möglichkeit sie via script herunterzuladen...
Als Lösung könntest du eine ID anstatt einen dateipfad übergeben und anhand einer datenbankabfrage an den dateipfad gelangen...
Eine ID ist fortlaufend und wenn nicht jeder einfach mal die nummer durchlaufen sollte kannst du anstatt einer ID einfach via md5 einen zufallswert generieren...
Falls dir das zuviel ist, könntest du auch einfach eingrenzen welches verzeichniss betroffen ist....
du übergibst nur noch den Dateinamen, machst ne sicherheitskontrolle und entfernt via
PHP:
str_replace("/", "", $file);
somit bleibt es immer bei einem Dateinamen....
Oder du grenzt ein, welche Dateitypen heruntergeladen werden dürfen (oder ausgegrenzt werden).
PHP:
$erlaubt=array("jpg", "pdf","...);
$filetyp=explode(".", $file);
if(in_array($filetyp[count($filetyp)], $erlaubt)){
// Oder !in_array
 
Zurück