Значит так, я разобрался почему не работало, теперь оно работает, но конечно не со 100 % гарантией. Решение было следующее:
не во всех случаях range вычислялся правильно. правильный код:
| Код | $str=substr($value,strpos($value,"=")+1); $range=explode('-',$str); if($range[0]==''){ $range[0]=filesize($filename)-intval($range[1])-1; $range[1]=filesize($filename)-1; }else{ $range[0]=intval($range[0]); $range[1]=($range[1]=='')?filesize($filename)-1:intval($range[1]); }
|
некоторым давнлоадерам необходимы хеадеры со статусом partial content. в итоге код полностью будет выглядеть так:
| Код | <? $headers = getallheaders(); $headout = ""; $pref=""; $filename="Flash8-en.exe"; function put_log($str){ $fp=fopen("log.txt",'a'); fwrite($fp,"$str\n"); fclose($fp); } while (list ($header, $value) = each ($headers)) { $headout.="$header: $value\n"; if(strpos($header,"Range")!==false){ $pref="cc_"; $str=substr($value,strpos($value,"=")+1); $range=explode('-',$str); if($range[0]==''){ $range[0]=filesize($filename)-intval($range[1])-1; $range[1]=filesize($filename)-1; }else{ $range[0]=intval($range[0]); $range[1]=($range[1]=='')?filesize($filename)-1:intval($range[1]); } put_log("Range: $value"); } } $f=fopen($pref."headers.txt",'w'); fwrite($f,$headout); fclose($f); header("Content-Type: application/octet-stream"); header("Last-Modified: ".gmdate('D, d M Y H:i:s', (1186041494)).' GMT'); header('ETag: "0-46435e-469c68a3"'); if(isset($range)){ //header("Content-Range: bytes {$range[0]}-{$range[1]}/".filesize($filename)); $length=$range[1]-$range[0]+1; //put_log("Content-Range: bytes {$range[0]}-{$range[1]}/".filesize($filename)); } header("Content-Disposition: attachment; filename=\"Ya.exe\""); if(isset($length)){ header("HTTP/1.1 206 Partial Content"); header("Status: 206 Partial Content"); header("Accept-Ranges: bytes"); header("Content-Length: ".$length); header("Content-Range: bytes {$range[0]}-{$range[1]}/".filesize($filename)); //put_log("len: $length"); }else { header("Accept-Ranges: bytes"); header("Content-Length: ".filesize($filename)); } ignore_user_abort(true); $f=fopen($filename,'rb'); if(isset($range)){ fseek($f,$range[0]); } while (!(connection_aborted() || connection_status() == 1)&&!feof($f)) { $cont=fread($f,2048); echo $cont; flush(); } fclose($f); ?>
|
если у кого еще возникнут вопросы по этому поводу обращайтесь по асе(123823) |