PHP下载文件并显示进度条

 

<html>
<meta charset="UTF-8">
<title>下载进度条演示</title>
<body>
<table border="1" width="300">
    <tr><td width="100">文件大小</td><td width="200"><div id="filesize">未知长度</div></td></tr>
    <tr><td>已经下载</td><td><div id="downloaded">0</div></td></tr>
    <tr><td>完成进度</td><td><div id="progressbar" style="float:left;width:1px;text-align:center;color:#FFFFFF;background-color:#0066CC"></div><div id="progressText" style=" float:left">0%</div></td></tr>
</table>
<script type="text/JavaScript">
    //文件长度
    var filesize=0;
    function $(obj) {return document.getElementById(obj);}

    //设置文件长度
    function setFileSize(fsize) {
        filesize=fsize;
        $("filesize").innerHTML=fsize;
    }

    //设置已经下载的,并计算百分比
    function setDownloaded(fsize) {
        $("downloaded").innerHTML=fsize;
        if(filesize>0) {
            var percent=Math.round(fsize*100/filesize);
            $("progressbar").style.width=(percent+"%");
            if(percent>0) {
                $("progressbar").innerHTML=percent+"%";
                $("progressText").innerHTML="";
            } else {
                $("progressText").innerHTML=percent+"%";
            }
        }
    }
</script>
<?PHP
ob_start();
@set_time_limit(300);//设置该页面最久执行时间为300秒
$url="http://xmgl.scst.gov.cn/up_files/2016/Chrome.zip";
$newfname="chrome.zip";//本地存放位置
$file = fopen ($url, "rb");
if ($file) {
    //获取文件大小
    $filesize = -1;
    $headers = get_headers($url, 1);
    if ((!array_key_exists("Content-Length", $headers))) $filesize=0;
    $filesize = $headers["Content-Length"];

    //不是所有的文件都会先返回大小的,有些动态页面不先返回总大小,这样就无法计算进度了
    if ($filesize != -1) {
        echo "<script>setFileSize($filesize);</script>";//在前台显示文件大小
    }
    $newf = fopen ($newfname, "wb");
    $downlen=0;
    if ($newf) {
        while(!feof($file)) {
            $data=fread($file, 1024 * 8 );//默认获取8K
            $downlen+=strlen($data);//累计已经下载的字节数
            fwrite($newf, $data, 1024 * 8 );
            echo "<script>setDownloaded($downlen);</script>";//在前台显示已经下载文件大小
            ob_flush();
            flush();
        }
    }
    if ($file) {
        fclose($file);
    }
    if ($newf) {
        fclose($newf);
    }
}
?>
</body>
</html>

发表评论

邮箱地址不会被公开。 必填项已用*标注