Downloadseite refreshen
Powl
- php
0 Felix Riesterer0 Powl
Hallo,
beim meinem Versuch ein kleines Downloadscript zu coden bin ich so vorgegangen:
index.php liest Dateien aus Verzeichnis aus und generiert Links nach dem Schema:
index.php?dl=dateiname.end
Wenn $_GET['dl'] einen existierenden Dateinamen enthält, wird der Zähler für die entsprechende Datei um 1 erhöht und mit folgendem Code der Download ausgelöst:
[Quelle: http://php.net/header]
<?php
$filename = "theDownloadedFileIsCalledThis.zip";
$myFile = "/absolute/path/to/my/file.zip";
header("Cache-Control: public, must-revalidate");
#Die nächste Zeile verstehe ich mal gar nicht! Wieso "hack"?
header("Pragma: hack"); // WTF? oh well, it works...
header("Content-Type: application/octet-stream");
header("Content-Length: " .(string)(filesize($myFile)) );
header("Content-Disposition: attachment; filename=\"".$filename."\"");
#Nächste Zeile hinzugefügt um beim Refresh der index.php keinen Binärmüll zu laden
header("Connection: close");
header("Content-Transfer-Encoding: binary");
readfile($myFile);
?>
Für alte IE's, die dabei scheitern, gibt es einfach einen header location auf den File und den Hinweis, mit Rechtsklicken und "Ziel speichern unter" den Download zu tätigen (wobei zips auch Linksklick funktionieren, jpg|gif|pdf uä. sonst geöffnet würden. Je nach mime typ und Browserkonfig halt.).
Soweit funktioniert das auch alles wie gewünscht. Was ich nun noch gerne erreichen möchte, ist das nach dem Download die index.php neu geladen wird, um den erhöhten Zählerstand anzuzeigen. Ich bin da mit verschiedenen Ansätzen nicht zum Ziel gekommen, so dass ich mittlerweile annehme, das wird nicht gehen.
Es sei denn der User frischt die Seite selbst auf.
Wenn die header für den Download gesendet wurden, haben weitere header keinen Effekt mehr.
Einen header location auf die index.php selbst zu setzen hat somit genausowenig Effekt, wie das cachen für index.php zu verbieten.
Gehe ich Recht in der Annahme, daß ein automatischer Refresh der index.php nach dem Download nicht möglich ist?
Sofern ich mich da irre würde ich ich über einen Ansatz freuen.
Danke.
netten Tag
^da Powl
Lieber Powl,
Wenn die header für den Download gesendet wurden, haben weitere header keinen Effekt mehr.
Einen header location auf die index.php selbst zu setzen hat somit genausowenig Effekt, wie das cachen für index.php zu verbieten.Gehe ich Recht in der Annahme, daß ein automatischer Refresh der index.php nach dem Download nicht möglich ist?
Deine Vermutungen sind meines Wissens richtig. Die einzige "Lösung", die mir einfällt, ist mittels Javascript. Über das reine HTTP-Protokoll ist jedenfalls dem Browser kaum mitzuteilen, dass die Ressource, die er angefordert hat, eine Änderung bei einer ehemals angeforderten Ressource bewirkt.
Ein Javascript, das einen Klick auf einen solchen Link abfängt, könnte das Neuladen der Seite erzwingen, wenn denn der Download gestartet wurde - sonst würde der nicht gestartet, da bei einem Linksklick der Browser zunächst versucht, die angeforderte Ressource in das Fenster zu laden, bevor er auf die Idee kommt, den User um einen Speicherort zu fragen.
Wenn Du schon mittels Javascript Deinen Zähler aktualisieren lässt, dann wäre auch ein Einsatz von Ajax möglich, der Timer-gesteuert den Zähler aktualisiert...
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix,
vielen Dank für Deine Antwort. Sowas ähnliches dachte ich mir schon. Auf der anderen Seite- was hier manchmal an Lösungen aufgezeigt wird- dachte es könnte nicht schaden mal zu fragen.
Frohes Pfingstfest liebes Forum
netten Tag
^da Powl