PHP: Abgebrochene Downloads wieder aufnehmen ermöglichen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

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


    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! ;)
  • 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.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Quellcode

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