2009-05-24 5 views
7

Normalerweise, wenn ich ein Benutzer zulassen mag, eine Datei herunterzuladen, ohne den genauen Standort enthüllt, verwende ich nur so etwas wie dies sie die Datei herunterladen lassen:Wie kann ich zulassen, dass ein Download pausiert/fortgesetzt wird?

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"" . $filename) . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . filesize($filename)); 
readfile("$filename"); 

Aber wenn sie einen modernen Browser verwenden oder Andere Download-Client, und sie pausieren den Download und versuchen, es fortzusetzen, das Skript (vorausgesetzt, sie sind noch authentifiziert oder was auch immer) wird die Header und die Dateiinhalte von Anfang an erneut senden, so dass der Download und grundsätzlich die Datei zu sein von Anfang an redownloaded.

Wie kann ich mein Skript aktivieren, um pausierte (und folglich wiederaufgenommene) Downloads zu kompensieren?

+0

Brauchen Sie wirklich diese Funktionalität finden? Erlangen Ihre geschützten Downloads Nutzer-Uploads? Wenn ja, wie hoch ist Ihre Upload-Größe? Wenn es 50 MB oder weniger ist, würde ich sagen, es ist in Ordnung, diese Funktionalität nicht zu haben. Oder, wenn sie alle Dateien sind, die Sie generieren, und die durchschnittliche Größe ist gleich klein, wird sie wahrscheinlich nicht benötigt. Auf der anderen Seite, wenn sie alle sehr große Dateien sind, könnten Sie in Betracht ziehen, sie als Torrent zu verteilen und dann den Download der Torrent-Datei zu schützen. Es ist nicht so sicher wie Benutzer Torrent-Dateien teilen können - nur etwas zum Nachdenken. –

+0

Von diesem Moment an frage ich, wie man nur das Wissen sucht, es in keinem bestimmten Projekt zu verwenden. Ich wollte diese Funktionalität in vergangenen Projekten haben, und ich werde das wohl in Zukunft tun. Ich dachte nur, ich würde fragen, während ich es nicht eilig habe, die Antwort zu finden. –

Antwort

10
ist

PHPs Für den zweiten Link Einbau-fopen die öffnen Datei und dann fsek an der richtigen Stelle (basierend auf dem Bereich in der Anfrage-Header) und dann die Teildatei mit fpassthru zurückgeben, anstatt readfile verwenden.

Sie können einige Beispiel-Code in PHP unter den Kommentaren für fread

+0

Ich habe diesen Code noch nicht getestet, aber es ist genau das, was ich gesucht habe, also akzeptiere ich dies als die Antwort. –

5

Sie müssen die Anforderungsheader wie Bereich, If-Bereich usw. lesen dann suchen Sie an der richtigen Stelle in der Datei. Normalerweise würde ein Web-Server dies für Sie in einer normalen Datei tun. Es ist ein komplexes wenig, aber hier ist etwas, das Ihnen den Einstieg bekommen könnte:

http://forums.asp.net/t/1218116.aspx

http://www.notes411.com/dominosource/tips.nsf/0/480C4E3BE825F69D802571BC007D5AC9!opendocument

der Code in Teil 12

+0

Das sind beide großartige Links ... aber ich verstehe den Code in diesen Beispielen nicht. Irgendwelche PHP-zentrischen Tutorials oder ähnliches, die du kennst? Google ist derzeit nicht seine übliche hilfreiche selbst ... –