You are not logged in.

  • Login

1

Wednesday, August 15th 2007, 7:07pm

PHP: Abgebrochene Downloads wieder aufnehmen ermöglichen

Moin,

öhm ich habe jetzt mal ne Frage stelle sie in da PHP Bereich weiß aber auch überhaupt nicht ob das mit PHP oder sonst was möglich ist!

Manchmal läd man was im Internet sagen wir mal bei rapidshare.com. Dann bricht plötzlich der Download ab. Kein Problem für Premium Downloader die können die Downloads weiter laufen lassen!

Jetzt meine Frage ist es möglich es mit PHP zu realisieren das User Downloads weiter laden können? 8|

Also wenn nicht: Alternative Möglichkeiten (CGI oder sonst was)

Also ich schmeiß jetzt einfach mal so nen Gedanken in denn Raum:

Dateien können ja ab ner bestimmten Stelle gelesen werden, wäre es jetzt nicht möglich wenn man dem User denn Download also per sagen wir mal:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$file = "./files/file.mp3"; // file to be send to the client
$speed = 85; // 8,5 kb/s download rate limit
 
if(file_exists($file) && is_file($file)) {
 
header("Cache-control: private");
header("Content-Type: application/octet-stream");
header("Content-Length: ".filesize($file));
header("Content-Disposition: filename=$file" . "%20");
 
flush();
 
$fd = fopen($file, "r");
while(!feof($fd)) {
echo fread($fd, round($speed*1024));
flush();
sleep(1);
}
fclose ($fd);
 
}
?>


sendet, die Stelle an der das Script also die Verbindung beim User unterbricht irgendwo speichert und die Datei ab der Stelle weiter sendet an der die Verbindung unterbrochen wurde? :pinch:

Ok ich hab jetzt schon vergessen was ich geschrieben habe aber sollte irgendwo verständlich sein, was ich meine? :?:

Denke schon das sowas gehen könnte, wäre nur auch die Frage ob beim User eine brauchbare Datei ankommt?

Grüße! ;)

2

Wednesday, August 15th 2007, 7:47pm

Dazu muss du den Request-Header glaub ich auswerten da dort ein Resume enthalten ist, dahinter ein Offset ab wo resumed werden soll. Genaueres steht bstimmt im RFC zu HTTP, ich habs noch nie gemacht und weiß es deswegen nicht präziser.

3

Thursday, August 16th 2007, 2:08pm

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
function dl_file_resume($file){
 
//First, see if the file exists
if (!is_file($file)) { die("[b]404 File not found![/b]"); }
 
//Gather relevent info about file
$len = filesize($file);
$filename = basename($file);
$file_extension = strtolower(substr(strrchr($filename,"."),1));
//This will set the Content-Type to the appropriate setting for the file
switch( $file_extension ) {
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "mp3": $ctype="audio/mpeg"; break;
case "mpg":$ctype="video/mpeg"; break;
case "avi": $ctype="video/x-msvideo"; break;
default: $ctype="application/force-download";
}
//Begin writing headers
header("Cache-Control:");
header("Cache-Control: public");
//Use the switch-generated Content-Type
header("Content-Type: $ctype");
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
# workaround for IE filename bug with multiple periods / multiple dots in filename
# that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe
$iefilename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1);
header("Content-Disposition: attachment; filename=\"$iefilename\"");
} else {
header("Content-Disposition: attachment; filename=\"$filename\"");
}
header("Accept-Ranges: bytes");
$size=filesize($file);
//check if http_range is sent by browser (or download manager)
if(isset($_SERVER['HTTP_RANGE'])) {
list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']);
//if yes, download missing part
str_replace($range, "-", $range);
$size2=$size-1;
$new_length=$size2-$range;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range$size2/$size");
} else {
$size2=$size-1;
header("Content-Range: bytes 0-$size2/$size");
header("Content-Length: ".$size);
}
//open the file
$fp=fopen("$file","rb");
//seek to start of missing part
fseek($fp,$range);
//start buffered download
while(!feof($fp)){
//reset time limit for big files
set_time_limit(0);
print(fread($fp,1024*8));
flush();
ob_flush();
}
fclose($fp);
exit;
}

4

Thursday, August 16th 2007, 5:31pm

Ja danke ne!

Hab das jetzt mal getestet also mit einer 170 MB großen Datei, hab Download abgebrochen und dann im FF auf nochmal versuchen geklickt ja der fängt dann aber nochmal von vorne an! Ist das so gedacht? ^^

5

Sunday, August 19th 2007, 12:54pm

Also bei Firefox hat das meiner Meinung nach noch nie so richtig funktioniert mit dem Pause/Wiederaufnehmen

6

Sunday, August 19th 2007, 8:25pm

Jo möglich, aber irgend eine Möglichkeit muss es ja geben! :P

Similar threads

Social bookmarks