2015-06-12 5 views
5

Ich benutze den folgenden Code, ich angepasst: http://ee.php.net/manual/en/function.fread.php#84115 zu meinem Code zu Download fortsetzen, funktioniert es großartig auf Firefox, aber funktioniert überhaupt nicht in Chrom. Wenn ich in Chrom versuchen, wird die Datei heruntergeladen haben, ich Pause, ein paar Minuten warten, aber dann, wenn ich es wieder der Download beendet sofort und die Datei beschädigt ist.PHP-Download Lebenslauf in Chrome HTTP RANGE funktioniert nicht

Irgendeine Idee warum?

function dl_file_resumable($file, $is_resume=TRUE) 
{ 
    //First, see if the file exists 
    if (!is_file($file)) 
    { 
     die("<b>404 File not found!</b>"); 
    } 

    //Gather relevent info about file 
    $size = filesize($file); 
    $fileinfo = pathinfo($file); 

    //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 
    $filename = (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) ? 
        preg_replace('/\./', '%2e', $fileinfo['basename'], substr_count($fileinfo['basename'], '.') - 1) : 
        $fileinfo['basename']; 

    $file_extension = strtolower($path_info['extension']); 

    $ctype='application/octet-stream'; 

    //check if http_range is sent by browser (or download manager) 
    if($is_resume && isset($_SERVER['HTTP_RANGE'])) 
    { 
     list($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2); 

     if ($size_unit == 'bytes') 
     { 
      //multiple ranges could be specified at the same time, but for simplicity only serve the first range 
      //http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt 
      list($range, $extra_ranges) = explode(',', $range_orig, 2); 
     } 
     else 
     { 
      $range = ''; 
     } 
    } 
    else 
    { 
     $range = ''; 
    } 

    //figure out download piece from range (if set) 
    list($seek_start, $seek_end) = explode('-', $range, 2); 

    //set start and end based on range (if set), else set defaults 
    //also check for invalid ranges. 
    $seek_end = (empty($seek_end)) ? ($size - 1) : min(abs(intval($seek_end)),($size - 1)); 
    $seek_start = (empty($seek_start) || $seek_end < abs(intval($seek_start))) ? 0 : max(abs(intval($seek_start)),0); 

    //add headers if resumable 
    if ($is_resume) 
    { 
     //Only send partial content header if downloading a piece of the file (IE workaround) 
     if ($seek_start > 0 || $seek_end < ($size - 1)) 
     { 
      header('HTTP/1.1 206 Partial Content'); 
     } 

     header('Accept-Ranges: bytes'); 
     header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$size); 
    } 

    //headers for IE Bugs (is this necessary?) 
    //header("Cache-Control: cache, must-revalidate"); 
    //header("Pragma: public"); 

    header('Content-Type: ' . $ctype); 
    header('Content-Disposition: attachment; filename="' . $filename . '"'); 
    header('Content-Length: '.($seek_end - $seek_start + 1)); 

    //open the file 
    $fp = fopen($file, 'rb'); 
    //seek to start of missing part 
    fseek($fp, $seek_start); 

    //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; 
} 

dl_file_resumable('/home/var/www/app/back/media/ready/5a58hGuRFR.tar'); 
+0

Ist das nicht [hier] (http://stackoverflow.com/questions/157318/resumable-downloads-when-using-php-to-send-the-file) genug Beispiele dafür, wie dies zu tun? – yergo

+0

Sie haben nicht die vollständige Skript enthalten, enden Sie das Skript mit einem '?>' Durch Zufall? –

+0

Auch, welche Web-Server-Software verwenden Sie? –

Antwort

1

Ich habe nicht versucht, Ihren Code ausführen, aber es sieht aus wie es einige Verwirrung mit switch-Anweisung ist:

  1. Es keine Bedeutung hat - wenn $ ext überhaupt gesetzt ist, wird es fallen in eine und nur Standardabschnitt
  2. Es hat falsche Syntax - nach Standard :
  3. sein sollte
  4. Es hat variable $new_name, die nicht überall
gesetzt

Am Ende hat diesen Fehler in der Antwort, werden verschiedene Browser sie anders behandeln.

+0

Noch mehr - ich sehe keinen Sinn in der switch-Anweisung überhaupt. – sitilge

+0

Hallo, Ich habe meinen Code mit der vollen Funktion und einigen Änderungen aktualisiert, ich habe den Schalterteil für den Inhaltstyp entfernt, weil ich den Download erzwingen will, also benutze ich immer "application/octet-stream". – Mokkun

+0

@Mokkun, also bedeutet es, dass es für Sie funktioniert? Ich habe versucht, mit ~ 180MB Zip-Datei, es funktioniert für mich auf Chrom 43.0.2357.124 m. + Ich habe 'usleep (100);' am Ende von 'while (! Feof ($ fp))' hinzugefügt, um die Netzwerkgeschwindigkeit zu simulieren. Es funktioniert auch in Firefox, Opera. IE erlaubt nicht zu stoppen (Schaltfläche deaktiviert), aber Safari für Windows nach dem Stop setzt den Download von Anfang an fort. – Pilskalns