tomovic
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
hallo,
ich möchte gerne in php einen Button erstellen.
Meine HP liegt in /var/www/meineHP/index.php
Der Downloadordner liegt in /var/www/geheimdl/123.zip Das ist mit Absicht so, dass kein anderer Zugriff bekommen kann aus meiner HP. Wie erstelle ich den Button?
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4378
Wohnort: Göttingen
|
Mir ist nicht ganz klar, was dein anliegen ist. Möchtest Du den Download mit einem Passwort schützen? Falls das dein Plan ist, so kannst Du das mit einer htaccess-Date erreichen: https://wiki.selfhtml.org/wiki/Webserver/htaccess/Passwortschutz
|
tomovic
(Themenstarter)
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
danke für die Antwort,
genau das möchte ich nicht machen. ☺ der link sollte in einem php Code drin stehen.
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4378
Wohnort: Göttingen
|
|
tomovic
(Themenstarter)
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
hallo,
danke für deine Idee, ich wollte gerade das Projekt abschliessen ☺
<?php
$file = 'monkey.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>
ich hole mir den link vom Mysql Server, stecke Sie in die $file und dann starte der Download.
Downlaod fertig, gleiche größe wie auf dem ftp Server, dann dachte ich ohh super. Als ich den Download öffnete, kommmt:
Die Datei ist beschädigt. ☹
|
GTAzoccer
Anmeldungsdatum: 18. Mai 2007
Beiträge: 255
Wohnort: Baden-Württemberg
|
Etwas ins Blaue geraten falls du uns hier nur einen Ausschnitt zeigst: Hast du darauf geachtet, dass dein Skript, abgesehen von readfile und header, nichts anderes tut? Wenn du über den Ausgabepuffer von PHP eine Datei übertragen willst, muss dieser leer sein, da das sonst mit in der Datei landet und diese beschädigt.
|
tomovic
(Themenstarter)
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
danke, hat fast geklappt, er lädt jetzt richtig runter. Bei Dateien größer wie 500 MB bricht der Download ab.
if (file_exists($file)) {
header('Content-Disposition: attachment; filename="'.basename($file).'"');
readfile($file);
// Code... Setzte den Wert 1 in der MySql Tabelle.
exit;
}
Was müss ich ändern, dass ich größere Dateien wie 500 MB zum Download anbeiten kann?
Bin für jeden Tip dankbar.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Es könnte sein, dass da die maximale Ausführungszeit für PHP-Skripte limitiert - also würde ich mir mal https://www.php.net/manual/de/info.configuration.php#ini.max-execution-time ansehen. Webserver können da auch Limits haben, wie lange ein Request dauern darf, der über CGI realisiert wird.
|
tomovic
(Themenstarter)
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
thx,
ich habe mit dem Gedanken auch schon gespielt ☺
Der Standartwert liegt bei 30 Sek.
Mein Download bricht bei 3 Minuten und 30 Sek. ab.
Wenn jemand ein Download mit einer lamen Internetverbindung hat, dann braucht er für 2000 MB Minimum 1 Tag ?!
Oder mache ich einen Denkfehler?
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7651
|
Schau mal ob dein Webserver X-Sendfile oder X-Accel unterstützt. Dann kann der Webserver selbst den Download übernehmen und PHP ist aus dem Spiel. (Wenn es dein eigener Root-/vServer ist, richte es dementsprechend ein) Alternativ gäbs die Möglichkeit einen temporären Redirect auf ein ebenso temporäres Unterverzeichnis zu machen, in das du die Datei ablegst / verlinkst. Manche Downloadseiten machen das so, die generieren dynamisch einen Downloadlink, der dann für eine bestimmte Zeit gültig ist. Das funktioniert dann auch mit externen Downloadmanagern. Damit umgehst du etwaige Limits vom PHP-Prozess, und in PHP funktioniert (ohne zusätzliche Schritte, siehe Kommentare auf php.net) auch kein Resume eines abgebrochenen Downloads weil HTTP-Ranges nicht unterstützt werden, wenn du einfach nur readfile machst. Wenn du also keine andere Lösung findest solltest du zumindest diese Möglichkeit einbauen, daß man abgebrochene Downloads fortsetzen kann.
|
tomovic
(Themenstarter)
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
thx,
ich habe den Xsendfile installiert und den Code hinzugefügt...
$file = "w.msu";
header('Content-type: ' . mime_content_type($file));
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Length: '. filesize($file));
ob_clean();
flush();
$fp = fopen($file, 'r');
while(($content = fread($fp, 4096)) != '') {
sleep(1);
print $content;
}
fclose($fp); ich läd die 100 MB Datei runter aber sehr langsam, LAut IE braucht er noch ein Tag.
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7651
|
Ja, äh... das ist immer noch PHP und der schläft 1 Sekunde für jeden 4K-Block. Kopier nicht blind irgendwelchen Code ohne ihn zu verstehen. Für sendfile machst du im PHP nur ein header() und nix mit open read print close, Google findet entsprechend Beispiele. Geht halt nur für Dateien und nicht für dynamisch erzeugte Inhalte Ob an dem ganzen dann irgendwas "geheim" ist kommt denn auch noch drauf an, dafür brauchst ja irgendeine Abfrage oder Authentifizierung im PHP (bevor du header() machst) und ohne das (wenns jeder runterladen kann) kannst du auch gleich bei einer normalen Datei bleiben
|
tomovic
(Themenstarter)
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
thx,
genau so ist es. ☺
Ich habe jetzt aus sleep(1); ein sleep(0,01) gemacht.
Alles Super, bis auf heute.
Sobald ich eine Datei über 4 GB herunterladen gibt es einen Abbruch. ☹
Brauche ich die Schleife?
Darf ist die 4096 erhöhen ?
Irgendwie stehe ich auf dem Schlauch?!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Weißt du mittlerweile, wer da limitiert (also PHP oder der Webserver, der das Skript anstößt)? Falls es PHP ist, könntest du https://www.php.net/manual/de/function.set-time-limit.php nutzen, um dem Skript mehr Zeit zu geben und falls es am Webserver hängt, musst du an dessen HTTP-Timeout Konfiguration basteln.
|
tomovic
(Themenstarter)
Anmeldungsdatum: 25. August 2013
Beiträge: 223
|
Hallo,
Ich habe mich nochmal schlau gemacht,
Ich kann mit einem 32 bit betriebsSystem max. Eine 2 GB Datei zuverfügung stellen und mit einem 64 bit System eine max 4 GB Datei. Ich lasse mich aber gerne durch einen besseren belehren.
|