Скачать файл по частям на сервер с помощью php
В нашей школе существует ограничение скорости интернета около 7 Кбит / с, и у нас есть несколько хостов php с объемом памяти 300 МБ. Но понял, что в наших php-скриптах нет никаких ограничений!
Я хотел скачать файл на свой хост и нашел ответ на этом сайте.
Ну, вот в чем проблема: я не могу загрузить более 300 Мб, а также хочу иметь возможность использовать учетную запись моего друга для ускорения моих загрузок (с их разрешения, конечно).
У меня есть полный доступ к компьютеру (в школе), который может переместить мои файлы 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++.
1 ответ
Хорошо, я кое-что сделал сам Это не совсем то, что я хотел, но как-то сработает:
<?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 внезапно завершает работу и оставляет мне только кучу бесполезные части!