2013-02-10 4 views
1

우리 학교의 인터넷 속도 제한은 약 7kb/s이며 300Mb 공간이있는 일부 PHP 호스트가 있습니다. 그러나 우리 PHP 스크립트에는 아무런 제한이 없다는 것을 깨달았습니다!일부 파일을 서버를 통해 PHP를 사용하여 서버에 다운로드

내 호스트에 파일을 다운로드하고 싶습니다. 이이 사이트에서 answer을 찾았습니다.

여기에 문제가 있습니다 : 300MB가 넘는 용량을 다운로드 할 수 없으며 내 친구의 계정을 사용하여 다운로드 속도를 높이고 싶습니다 (물론 허가하에).

나는 less_then_300Mb_ 파일을 스스로 옮길 수있는 컴퓨터 (학교 내)에 대한 모든 권한을 가지고 있으며 나머지는 다운로드 할 수 있습니다. 그것은 로컬 파일에 잘 작동하지만 fseek & 다른 명령의 URL에서 잘 작동하지 않는

<?php 
function downloadfile ($url, $path){ 
    $step=1024; 
    $fsize=0; 
    if(file_exists($path)) 
    $fsize=filesize($path); 
    $dlsize=filesize($url); 
    echo "$fsize<br>$dlsize<br>"; 

    $file = fopen ($url, "rb"); 
    if ($file) 
    { 
$newf = fopen ($path, "ab"); 
fseek($newf,$fsize); 
fseek($file,$fsize); 
if($newf) 
    while(ftell($newf)<$dlsize) 
    { 
     if($dlsize-ftell($newf)<$step) 
      fwrite($newf, fread($file, $dlsize-ftell($newf)), $dlsize-ftell($newf)); 
     else 
      fwrite($newf, fread($file, $step), $step); 
    } 

} 

if ($file) 
    fclose($file); 


if ($newf) 
    fclose($newf); 

} 


$url=$_GET['url']; 
$exp=explode("/",$url); 


downloadfile($url,$exp[count($exp)-1]); 

?> 

:

내가이 코드를 작성 시작합니다.

IDM과 같아서 에 이력서를 일시 중지하고 파일을 일시 중지 할 수 있습니다. 또한 가능하다면 복수 요청을 사용하여 다운로드하려고합니다.

내 기능에 문제가 있는데 어떻게 파일의 일부를 다운로드합니까?

자세한 내용은 : 서버는 난에 액세스 할 수있는 컴퓨터가 WIN7가
입니다 기반의 리눅스입니다.
나는 vb.net, PHP (!) 및 비트 C++를 알고 있습니다.

+0

파일을 다운로드하는 서버는 부분 파일 다운로드를 지원해야합니다. 이는 모든 서버에서 지원되지는 않습니다. 대역폭이 관리되는 방식 (예 : 중간에 프록시가있는 경우)에 따라 부분 다운로드가 중단 될 수도 있습니다. 가능한 경우 부분 다운로드를 지원하는 서버를 사용하여 테스트 해보십시오. –

+0

서버가 부분 파일 다운로드를 지원하는지 어떻게 확인할 수 있습니까? (그런데, 서버는 파일을 다운로드 할 수 있지만 아무런 손상도 없다는 보증은 없습니다!) 2102 M OPENCV !, 나머지 40 MB는 idm에 의해 집에 있습니다!) – aliqandil

+0

좋은 질문입니다. 내가 생각할 수있는 유일한 방법은 다운로드를 다시 시작하고 파일 다운로드를 시작하고 중지 한 다음 다시 시작할 수있는 브라우저를 사용하는 것입니다. 정상적으로 다시 시작되면 서버는 부분 다운로드를 지원합니다. Chrome/Chromium이이를 지원한다고 확신합니다. –

답변

0

좋아, 나 혼자서 한 것. 그것은 내가 원하는 것을 정확히 아니지만, 어떻게 든 트릭을 할 것입니다 :

<?php 
set_time_limit(0); 

function existsin($ar,$key) 
{ 
    foreach ($ar as $s => $val) 
     if ($s==$key) return true; 
    return false; 
} 

function toinf($str,$path) 
{ 
$fhr=fopen ("$path/inf.txt", "w"); 
fwrite($fhr,$str); 
fclose($fhr); 
} 


function downloadfile ($url, $path, $len, $num, $waittl) 
{ 
    $exp=explode("/",$url); 
    $fname=$exp[count($exp)-1]; 
    $prt=0;$ppath=$path; 
    $sp=1;$exectime=10000; 
    $file = fopen ($url, "rb"); 

    if ($file) 
    { 
     $newf = fopen ($path, "wb"); 
     if ($newf) 
      while(!feof($file)) 
      { 
       if(ftell($newf)/1048576 >= $len && $len!=0) 
       { 


       while(file_exists($ppath) && $waittl) 
        usleep(5000); 

       $prt=$prt+1; 
       fclose($newf); 
       $ppath=$path.".part".$prt; 
       if(is_dir($num)) 
        $newf = fopen ($ppath, "wb");   
       else 
        die("rested!"); 
       } 
       toinf("$fname|Downloading",$num); 

      $timepre = microtime(true); 
      fwrite($newf, fread($file, 1024 * $sp), 1024 * $sp); 
      $timepost = microtime(true); 
      $exectime2= $exectime; 
      $exectime = $timepost - $timepre; 
      if($exectime2 > $exectime && 65536>$sp) {$sp=$sp*1.5;} else if($sp>=1) $sp=$sp/1.5; 
      if($sp<=0) $sp=1; 


      } 
    } 

    if ($file) 
     fclose($file); 


    if ($newf) 
     fclose($newf); 

} 


if(existsin($_GET,'url')==false) {echo("invalid arg");return 0;} else echo ("started."); 
$url=$_GET['url']; 
$exp=explode("/",$url); 

for($i=1;is_dir($i);$i++); 
mkdir($i); 
toinf($exp[count($exp)-1]."|Started",$num); 
$maxlen=50;$waittl=true; 
if(existsin($_GET,'maxlen')==true) $maxlen=$_GET['maxlen']; 
if(existsin($_GET,'wait')==true) $waittl=false; 
downloadfile($url,$i."/".$exp[count($exp)-1],$maxlen,$i,$waittl); 
toinf($exp[count($exp)-1]."|Done",$i); 
?> 

나는 아직 다운로드를 재개 할 수 없습니다,하지만 난이 부분에서 그것을 일부를 다운로드하고 학교 공간 필터를 통과 할 수 ... 하지만 가끔은 (내가 어떤 이유인지 모르겠다.) PHP가 갑자기 종료되고 쓸모없는 부분 만 남겨 둡니다!