php download funktion mit multipart und resume
April 30th, 2006 by admin
die funktion erlaubt downloadbeschleuniger(flashget, getright usw.) einzusetzen und den download zu resumen. zusätzlich kann nach abbruch oder fertigstellung des downloads eine funktion ausgeführt werden. diese könnte z.b. den erzeugten traffic abspeichern. wer mit der $chunksize und dem sleep(1) experimentiert kann die downloadgeschwindigkeit beliebig anpassen.
PHP:
-
function output_file($file,$name)
-
{
-
//register_shutdown_function( 'function_name' );//do something on download abort/finish
-
-
$UserBrowser = "Opera";
-
$UserBrowser = "IE";
-
else
-
$UserBrowser = '';
-
$mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ? 'application/octetstream' : 'application/octet-stream';/// important for download
-
///// multipart-download and resume-download
-
{
-
$size2 = $size-1;
-
$new_length = $size-$range;
-
}
-
else
-
{
-
$size2=$size-1;
-
}
-
$chunksize = 1*(1024*1024);
-
$this->bytes_send = 0;
-
{
-
{
-
//sleep(1);//// decrease download speed
-
}
-
}
-
else
-
$size = $new_length;
-
}
Posted in php |
Juni 6th, 2006 at 04:06
Hallo, $this->bytes_send mag er bei mir nicht, sowie wird nach dem download keine weiter funktion ausgeführt..
nach flush(); ist leider schluß.. aber danach sollte es weitergehen..
Juni 14th, 2006 at 15:25
@ICh
mach $bytes_send draus
Dezember 23rd, 2006 at 08:37
Danke für diese Funktion, des is echt genial, das Teil.
Aber hab ma 2 Fragen:
Die Variable $bytes_send hat doch anscheinend (für die Funktionalität an sich) keinen Zweck — wozu isn die dann dort?
Zweitens: Bei Fehlern sollte man da nicht lieber die HTTP-Statuscodes zurückgeben, statt einfach mit die() zu beenden?
D.h. bei “die(’file not exist!’);” den Code 404 und bei “die(’error can not open file’);” den Code 505 zurückgeben.
Und zu guter letzt: Was bringt diese Frage, ob $new_length gesetzt is, ab Zeile 57? Hat doch eigentlich nicht mehr große Auswirkungen auf den Download, oder täusch ich mich?
mfg, mh166
Dezember 23rd, 2006 at 12:29
1. $bytes_send kannst du nutzen um z.b. in einer mysql db die runtergeladenen mb von einem bestimmten nutzer zu zählen (like rapidshare) dabei verweise ich einfach mal auf register_shutdown_function.
2. das ist richtig. aber für meine zwecke benötige ich soetwas nicht.
3. die variable new_length hat eigentlich nur etwas mit dem header bei multipartdownloads zu tun und kann somit bei normalen downloads vernachlässigt werden. da die funktion eigentlich eine methode aus einer download-klasse ist kann es sein das ich die variable noch für andere zwecke benötige (müßte ich aber im source code nachschauen).
hoffe das reicht dir an antworten. wenn nicht einfach weiter fragen.
Januar 6th, 2007 at 16:51
Erst einmal großes lob, nach so etwas suche ich schon länger.
Kann es sein, dass das Firefox Plugin DownloadThemAll mit der Funktion nicht richtig klar kommt? Mir ist auf gefallen, dass DTA zuerst wie gewollt die Datei in X Teilen runter läd, aber dann die ganze Datei noch einmal am Stück.
Beim FreeDownloadManager, den ich auch noch getestet habe, tritt dieser Fehler nicht auf. Der FDM benötigt aber um das Teilstück 2 zu laden fast immer zwei Anläufe.
Wollte nur einmal nachfragen, ob dieses Problem, bei anderen auch auftritt.
Januar 6th, 2007 at 20:06
ich hab es damals mit dem firefox 1, flashget, und ie getestet.
bei mir hat alles funktioniert.
wenn ich ein wenig zeit hab werd ich mir das mal genau anschauen.
Januar 10th, 2007 at 16:34
Was genau soll denn das machen?
str_replace($range, “-”, $range);
???
Ist doch irgendwie sinnlos, weil der zurückgegebene Wert nirgendwo gespeichert wird.
Januar 13th, 2007 at 13:16
da haste eindeutig recht. könnte sein das ich das mal zum testen hatte. kannste natürlich löschen
Januar 17th, 2007 at 17:37
header(”Content-Range: bytes $range$size2/$size”);
Und das? *g*
Wenn $range == 0-500 ist und die Datei 1000 Bytes groß ist, kriegt der Browser sowas wie
Content-Range: bytes 0-500999/1000
geliefert. Mal davon abgesehen, dass ich nicht weiß, was in
$new_length = $size-$range;
passiert, wenn $range die Zeichenkette ‘0-500′ ist. Könnte der Grund sein, warum das Script bei mir mit Downloadmanagern auch nicht *so* wirklich funktioniert.
Januar 17th, 2007 at 17:41
Mach’s mal lieber so (Variablen sind aber ein bisschen anders):
$size = filesize($file);
$end = $size - 1;
if (isset($_SERVER['HTTP_RANGE'])) {
list($dummy, $range) = explode(’=', $_SERVER['HTTP_RANGE']);
list($start, $dummy) = explode(’-', $range);
$length = $size - $start;
header(’HTTP/1.1 206 Partial Content’);
} else {
$start = 0;
$length = $size;
}
header(’Content-Length: ‘.$length);
header(”Content-Range: bytes $start-$end/$size”);
und dann unten halt Datei öffnen und
fseek($file, $start);
Einziges Manko ist jetzt noch, dass das Script immer den kompletten Rest schickt, auch wenn der Endwert in $range gar nicht das Dateiende ist.
Januar 18th, 2007 at 17:20
hast du “Content-Range: bytes 0-500999/1000″ mit eigenen augen gesehen oder denkst du das es diese werte bekommt?
ich hätte es sonnst nicht so gemacht.
bitte versuche es einmal mit flashget dort müßtest du all gesendeten header sehen können.
und wie gesagt bei mir funktioniert es.
Januar 20th, 2007 at 18:26
Nachdem Download Accelerator nur korrupte Daten lieferte und ein FF mit “DownThemAll”-Plugin in einer Endlosschleife(!) anfing, die Datei zu ziehen, habe ich mir die Aussage angesehen.
Kann ja sein, dass FlashGet zurechtkommt. Die beiden anderen wollten jedenfalls nicht.