2

私たちの学校には約 7kb/s のインターネット速度制限があり、300Mb 容量の php ホストがいくつかあります。しかし、私たちの PHP スクリプトには制限がないことに気付きました!

ホストにファイルをダウンロードしたかったのですが、このサイトで答えを見つけました

ここに問題があります。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のようにして、ファイルを再開および一時停止できるようにしたい。また、できれば複数リクエストでダウンロードしてほしいです。

私の機能の何が問題なのですか? ファイルの一部をダウンロードするにはどうすればよいですか?

詳細情報: サーバーは Linux ベース
で、アクセスできるコンピューターは win7 です。
vb.net、php(!)、および少しの C++ を知っています。

4

1 に答える 1

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 が突然終了し、たくさんのファイルしか残らないことがあります。無駄な部品!

于 2013-02-13T20:31:42.523 に答える