template
Siehe auch PHP/MySQL -> Downloadstream erzeugen (ohne temoräre Datei)
Normalerweise liegen Daten (Skripte, Bilder, Dokumente) als statische und direkt downloadbare Dateien auf dem Webserver. Es gibt jedoch Fälle, in denen das nicht so ist:
- Daten werden erst zur Laufzeit generiert (z.B. Statistiken)
- Dateien werden ausserhalb des Webserverpfades gelagert (z.B. Dokumentenarchiv)
- Daten werden aus Sicherheitsgründen in einer Datenbank gelagert
Damit der Benutzer auf die Daten zugreifen kann, muss eine (temporäre) Datei im Webserverpfad erzeugt und zum Herunterladen angeboten werden. Üblicherweise soll die Datei nach dem Download dann wieder gelöscht werden.
Die hierzu benötigen Schritte werden am besten in einem separaten Dialog gekapselt: Das aufrufende Skript öffnet ein Popup und übergibt dabei evtl. relevante Parameter. Der PHP-Code im Popup liest die Parameter aus und erzeugt eine entsprechende Datei (z.B. durch Kopieren, Generieren oder Konvertieren). Im HTML-Code wird ein normaler Link auf die Datei angezeigt.
Um zu erfahren, wann die Datei wieder gelöscht werden kann, zeigen wir ausserdem einen eigenen Schließen-Button (oder -Link) an, welcher bewirkt, dass sich das Popup-Skript erneut - evtl. mit entsprechendem Parameter - aufruft. Bei diesem zweiten Aufruf wird die Datei seitens PHP gelöscht und das Popupfenster anschließend mittels Javascript geschlossen.
Beispiel für einen Download-Dialog:
Php Einleitung
if (strlen($tmp = $_GET['tmp'])) { //---- aufräumen
@unlink("downloadordner/". $tmp); // temporäre Datei löschen
} else { //---- Download vorbereiten
// ... evtl. Benutzerauthentifizierung ...
// ... evtl. GET-Parameter auslesen ...
// ... evtl. Datenbankzugriff ...
$tmpfile = ... // hier: temporären Namen erzeugen
$fp = fopen("downloadordner/". $tmpfile, "w"); // Datei öffnen (binär: "wb")
// ... Daten schreiben: fputs($fp, ...) oder binär fwrite($fp, ...) ...
fclose($fp); // Datei schließen
}
Im Header, im Javacript-Bereich:
<?php if (strlen($tmp)) { ?>window.close;<?php } ?>
Weiter unten, im BODY:
<a href='downloadordner/<?php echo $tmpfile; ?>'>Ihre Datei</a><br>
<br>
<a href='javascript:self.location.href="<?php
echo basename($_SERVER['PHP_SELF']); ?>?tmp=<?php echo $tmpfile; ?>"'>Schließen</a>
Falls es sich um sicherheitskritische oder private Daten handelt, sollte im Popup eine Benutzeridentifizierung vorgenommen werden, um einen Missbrauch der GET-Parameter zu verhindern.
- Beispiel 1: Ein Benutzer soll sich eigene private Infos herunterladen können und beim Aufruf des Popups wird folgendes übergeben: "popup.php?userid=3". Es ist offensichtlich, dass man hier durch Manipulation des Parameters userid an die Infos anderer Benutzer gelangen kann.
- Beispiel 2: Ein Benutzer soll sich eigene Dateien aus einem Onlinearchiv herunterladen können und beim Aufruf des Popups wird folgendes übergeben: "popup.php?userid=3&docnr=2". Auch hier könnten durch Manipulation der Parameter fremde Dateien heruntergeladen werden.
template |
 |