2013-02-10 101 views
1

我們學校的網速限制約爲7kb/s,我們有一些300Mb空間的php主機。但意識到我們的PHP腳本沒有限制!使用php下載部分文件到服務器使用php

我想下載一個文件到我的主機和我沒有在這個網站上找到一個answer

那麼這裏是問題所在:我無法下載超過300 MB的文件,而且我希望能夠使用我的朋友的帳戶加速我的下載(當然還有他們的許可)。

我可以完全訪問計算機(在學校),可以將我的less_then_300Mb_files移動到自己,讓我下載其餘的。

要開始我寫了這個代碼:

<?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]); 

?> 

它的偉大工程中的本地文件,但fseek &其他一些命令沒有在URL中運作良好。

我希望它能像IDM,能夠恢復和暫停文件。另外,如果可能,我希望它下載使用多個請求

我的功能有什麼問題,以及如何下載文件的一部分?

更多信息: 基於服務器的
我要訪問的計算機是win7的是Linux操作系統。
我知道vb.net,php(!)和一點C++。

+0

您要下載文件的服務器必須支持部分文件下載。這不是所有服務器都支持的。根據您的帶寬管理方式,即中間是否有代理,這也可能會導致部分下載。如果可以,請嘗試使用您知道支持部分下載的服務器進行測試。 – 2013-02-10 16:04:05

+0

我如何檢查服務器是否支持部分文件下載? (順便說一下,服務器可以下載文件,但不能保證它沒有損壞!,我下載210MB的OPENCV !,其餘的40MB由idm在我家裏!) – aliqandil 2013-02-10 16:13:55

+0

這是一個很好的問題。我能想到的唯一方法是使用支持恢復下載的瀏覽器,然後開始下載文件,停止並恢復。如果恢復正確,則服務器支持部分下載。我很確定Chrome/Chromium支持這一點。 – 2013-02-10 16:20:58

回答

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突然終止,只剩下一堆無用的部分!