• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Download mit Header, Seite neu laden

jonathan09

Neues Mitglied
Hey,

kurz zusammengefasst werden Dateien über einen Link download.php?dl=1 heruntergeladen. Nach verschiedenen Prüfungen übergibt die download.php die Datei via Header:
PHP:
function makeDownload($file, $dir, $type) {
    header("Content-Type: $type");
    header("Content-Disposition: attachment; filename=\"$file\"");
      header("Content-Length: ".filesize($dir . $file)."\n");  
      readfile($dir.$file);
}
Klappt alles wunderbar, allerdings:
Die Seite, über welche der Download aufgerufen wird, sollte nach dem Download neu geladen werden. Ist das irgendwie möglich?

Danke Euch!

LG
 
<body <?php if( $reload ){ ?> onLoad="window.reload();" <?php } ?> >
..
</body>


oder nach readfile( .. ):

header( 'Location: '.$_SERVER[ 'PHP_SELF' ] );


Teste es mal aus, bin mir nicht mehr so sicher.
 
Hmm.. stimmt , readfile ist ja bereits eine Ausgabe :/

Ja dann Meta refresh oder Javascript reload, wie du lustig bist. Meta Refresh erfordert kein JS was eventuell Vorteilhaft ist.
 
Noch etwas sei angemerkt.

Vor dem header Download ist es ratsam ein
PHP:
ob_end_clean();
zu senden. Ich habe da vor Kurzem gut 2 Stunden verplempert, als mir noch ein Leerzeichen aus dem Buffer mitgesendet wurde und die Datei zerhackt hat.
 
Hey,

danke für die Antworten und Eure Tipps!

An meta refresh habe ich auch gedacht, allerdings müsste ich die entsprechende Seite ja dann automatisch alle x (z.B. 3 Sekunden) neu laden. Nach dem Download kann ich ja auf keine andere Seite umleiten o.ä. um dann z.B. per Get einen Parameter zu übergeben, der das Neuladen auslöst...
 
.....allerdings müsste ich die entsprechende Seite ja dann automatisch alle x (z.B. 3 Sekunden) neu laden.
Wieso das?
Nach dem Download kann ich ja auf keine andere Seite umleiten o.ä. um dann z.B. per Get einen Parameter zu übergeben, der das Neuladen auslöst...
Natürlich kannst du das.
PHP:
$header = 'blabla.php?tralala=1';
echo '<meta http-equiv="refresh" content="0;URL='.$header.'">';

Ich finde es nur nicht gelungen das aus dem Download-Fenster zu machen, da der Refresh direkt nach dem header ausgelöst wird.
Besser wäre es, den header z.B. in einem neuen Fenster zu starten und dann nach dem Download automatisch zu schliessen.

PHP:
// eine Seite aufrufen, die 2 Ebenen höher liegt 
$link_to_refresh_script = "<body onload=\"opener.location.href='../../index.php';window.close();return false\"></body>";
echo $link_to_refresh_script;
Dazu muss das Download Fenster nur per javascript geöffnet werden. z.B.
PHP:
<a name="clean" onclick="window.open('download.php', 'download','width=5, height=5,top=5,left=5,scrollbars=0')">Download</a>
 
Hey,

danke für die Idee, ledier verstehe ich den Code nicht wirklich.

Deine Vorgehensweise verstehe ich wie folgt:
download.php über Java in einem neuen Fenster öffnen, dieses löst den Download aus, lädt im "Mutter-Fenster" die angegebene Seite und schließt sich dann?

Das funktioniert leider nicht. Der Download wird nicht ausgelöst, stattdessen wird in dem neu geöffneten Fenster auf die im body-Tag verwiesene Seite umgeleitet.
 
*JavaSCRIPT*, es gibt nämlich auch "nur" -Java- und das ist was anderes.

Das Prinzip geht wie folgt:

[loop]
- Startseite: Man klickt auf "Downloads".
- Downloads: Man klickt auf Kategorie "Spiele".
- Downloads/Spiele: Man klickt auf "Space Invader free".
- Downloads/Spiele/SI-Free: Da klickt man auf den "Download"-Button.
- Startseite: Es öffnet sich per Javascript die Seite "Progress/Download/SI-Free" welches den Header sendet, dass das Spiel downloaded und am Ende des Codes ein Javascript Befehl hat welches das Fenster schließt, also "window.close();".
[/loop]
 
Ich warne einfach mal davor, so Dinge wie einen Download zu sehr zu verkomplizieren. Am Ende geht es dann nämlich unter Umständen in manchen Clients nicht mehr.

Das soll jetzt nicht heißen, dass die angesprochenen Lösungen nicht durchführbar wären. Ich finde nur immer, die Abhandlung solcher Operationen ist zu einem Großteil Client-Sache. Ich glaube, Firefox bietet zum Beispiel eine Option an, leere Seiten beim Auslösen von Downloads zu unterdrücken.
 
.....
Die Seite, über welche der Download aufgerufen wird, sollte nach dem Download neu geladen werden. Ist das irgendwie möglich?....
Prinzipiell stimme ich zu. Nur ist obiger Wunsch das Problem, der das alles etwas kompliziert macht.

Manche Browser (vor allem die ie Familie, 1 oder 2 Firefox-Versionen) brechen nach einem voreiligen refresh den Download ab oder verstümmeln u.U. die Datei. Dazu habe ich auch schon mal ein Thema hier erstellt. http://www.html.de/php/41087-readfile-fuegt-leere-zeile-ein.html.

Meine Idee dazu wäre eine neue Instanz zu starten, die den Download zu Ende bringen kann (so habe ich das damals gelöst). Ein Refresh der Seite, wo der Download gestartet wird ist dann kein Problem.
Bei mir hat sich damals gezeigt, dass einRefresh eventuell etwas an den Buffer (also die Download-Datei) ahängt oder etwas davor einfügt, was z.B. Bilder vollkommen zerstört. Ajax wäre da auch noch ein Ansatz, kommt aber bei abgeschaltenem JS nicht in Frage (was zugegebener Massen auch für ein Popup per JS gilt).

Meine Lösung funktioniert nun in allen getesteten Browsern und sieht wie folgt aus:

1. Download anbieten, Popup per JS öffnen (neue Instanz)
2. Buffer des Popups löschen und header senden (Download starten).
3. Ein refresh der Ursprungsseite auslösen.

Was übrigens nebenbei auch den Vorteil mit sich bringt, den Code sauber getrennt zu haben.
 
Zurück
Oben