2015-06-12 12 views
5

Aşağıdaki kodu kullanıyorum, adaptasyon için http://ee.php.net/manual/en/function.fread.php#84115 koduma geri dönelim, itfaiyede harika çalışıyor ama kromda hiç çalışmıyor. Chrome denerseniz, dosya indiriliyor, duraklatıyorum, birkaç dakika bekleyin, ancak devam ettiğimde, indirme işlemi anında tamamlanır ve dosya bozulur.PHP download özgürlüğü Chrome'da HTTP RANGE çalışmıyor

Neden olursa olsun?

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

Burada (http://stackoverflow.com/questions/157318/resumable-downloads-when-using-php-to-send-the-file) bunun nasıl yapılacağına dair yeterli örnek var mı? – yergo

+0

Komut dosyasını dahil etmediniz, betiği bir??> 'Ile bitebiliyor musunuz? –

+0

Ayrıca, hangi web sunucusu yazılımı kullanıyorsunuz? –

cevap

1

Ben senin kod yürütmesine çalıştı yoktu, ama anahtar deyimi ile bazı karışıklık var gibi görünüyor: Bu bir anlamı yoktur

  1. - $ ext hiç ayarlanırsa, o olacak ilk ve tek varsayılan bölümüne girer
  2. yanlış sözdizimi vardır - varsayılan olmalıdır sonra :
  3. O
yerde ayarlı değil değişken $new_name sahiptir

Sonuçta, bu hataları yanıtlarken, farklı tarayıcılar bunları farklı şekilde ele alacaktır.

+0

Daha da fazlası - Anahtar deyiminde herhangi bir anlam göremiyorum. – sitilge

+0

Merhaba, Tam işlev ve bazı değişiklikler ile kodumu güncelledim, ben indirmeyi zorlamak istediğim için içerik türü için anahtar bölümünü kaldırdım, bu yüzden her zaman "application/octet-stream" kullanıyorum. – Mokkun

+0

@Mokkun, bu sizin için uygun olduğu anlamına mı geliyor? ~ 180MB zip dosyası ile denedim, benim için 43.0.2357.124 m krom üzerinde çalışır. + Ağ hızını simüle etmek için while ('feof ($ fp))' döngüsünün sonunda 'uykuya (100) 'eklendi. Firefox, Opera'da da çalışıyor. IE, durdurmaya (düğme devre dışı) izin vermez, ancak durduktan sonra Windows için Safari, baştan yüklemeyi sürdürür. – Pilskalns