2013-02-10 88 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突然终止,只剩下一堆无用的部分!