使用php将文件逐部分下载到服务器
我们学校有一个大约7kb/s的互联网速度限制,我们有一些300Mb空间的php主机。但是一个程序员意识到我们的php脚本没有限制 我想下载一个文件到我的主机上,我在这个网站上找到了一个 问题是:我不能下载超过300MB的内容,而且我希望能够使用我朋友的帐户来加速我的下载速度(当然是在他们允许的情况下) 我可以完全访问一台计算机(在学校),它可以将我的小于300Mb的文件移动到自己的计算机上,并让我下载其余的文件 首先,我编写了以下代码:使用php将文件逐部分下载到服务器,php,vb.net,multithreading,binaryfiles,resume-download,Php,Vb.net,Multithreading,Binaryfiles,Resume Download,我们学校有一个大约7kb/s的互联网速度限制,我们有一些300Mb空间的php主机。但是一个程序员意识到我们的php脚本没有限制 我想下载一个文件到我的主机上,我在这个网站上找到了一个 问题是:我不能下载超过300MB的内容,而且我希望能够使用我朋友的帐户来加速我的下载速度(当然是在他们允许的情况下) 我可以完全访问一台计算机(在学校),它可以将我的小于300Mb的文件移动到自己的计算机上,并让我下载其余的文件 首先,我编写了以下代码: <?php function downloadfil
<?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]);
?>
它在本地文件上运行得很好,但在URL中,其他一些命令运行得不好
我希望它像,能够恢复和暂停一个文件。另外,如果可能的话,我希望使用多个请求下载它
我的功能有什么问题?如何下载文件的一部分
更多信息:
服务器是基于linux的我可以访问的计算机是win7。
我知道VB.NET,PHP(!)和一点C++。
好的,我自己做了一些事情。 这并不完全是我想要的,但会以某种方式实现:
<?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突然终止,只留下一堆无用的部分 从中下载文件的服务器必须支持部分文件下载。并非所有服务器都支持这一点。根据带宽的管理方式,即如果中间有代理,也可能会中断部分下载。如果可以,请尝试使用您知道支持部分下载的服务器进行测试。如何检查服务器是否支持部分文件下载?(顺便说一句,服务器可以下载文件,但不能保证它没有损坏!我在家里下载了210 Mb的OPENCV!,其余40 Mb由idm下载!)这是个好问题。我能想到的唯一方法是使用支持恢复下载的浏览器,然后开始下载文件,停止并继续。如果恢复正确,则服务器支持部分下载。我很确定Chrome/Chrome支持这一点。哦!明白了,是的,我在把文件交给脚本之前确实检查过了。我检查一个文件是否支持部分文件下载的方法是检查idm是否可以通过多个连接下载它,我只是不知道它是部分下载!谢谢