PHP下载文件并显示进度条

 

  1. <html>
  2. <meta charset="UTF-8">
  3. <title>下载进度条演示</title>
  4. <body>
  5. <table border="1" width="300">
  6. <tr><td width="100">文件大小</td><td width="200"><div id="filesize">未知长度</div></td></tr>
  7. <tr><td>已经下载</td><td><div id="downloaded">0</div></td></tr>
  8. <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>
  9. </table>
  10. <script type="text/JavaScript">
  11. //文件长度
  12. var filesize=0;
  13. function $(obj) {return document.getElementById(obj);}
  14.  
  15. //设置文件长度
  16. function setFileSize(fsize) {
  17. filesize=fsize;
  18. $("filesize").innerHTML=fsize;
  19. }
  20.  
  21. //设置已经下载的,并计算百分比
  22. function setDownloaded(fsize) {
  23. $("downloaded").innerHTML=fsize;
  24. if(filesize>0) {
  25. var percent=Math.round(fsize*100/filesize);
  26. $("progressbar").style.width=(percent+"%");
  27. if(percent>0) {
  28. $("progressbar").innerHTML=percent+"%";
  29. $("progressText").innerHTML="";
  30. } else {
  31. $("progressText").innerHTML=percent+"%";
  32. }
  33. }
  34. }
  35. </script>
  36. <?PHP
  37. ob_start();
  38. @set_time_limit(300);//设置该页面最久执行时间为300秒
  39. $url="http://xmgl.scst.gov.cn/up_files/2016/Chrome.zip";
  40. $newfname="chrome.zip";//本地存放位置
  41. $file = fopen ($url, "rb");
  42. if ($file) {
  43. //获取文件大小
  44. $filesize = -1;
  45. $headers = get_headers($url, 1);
  46. if ((!array_key_exists("Content-Length", $headers))) $filesize=0;
  47. $filesize = $headers["Content-Length"];
  48.  
  49. //不是所有的文件都会先返回大小的,有些动态页面不先返回总大小,这样就无法计算进度了
  50. if ($filesize != -1) {
  51. echo "<script>setFileSize($filesize);</script>";//在前台显示文件大小
  52. }
  53. $newf = fopen ($newfname, "wb");
  54. $downlen=0;
  55. if ($newf) {
  56. while(!feof($file)) {
  57. $data=fread($file, 1024 * 8 );//默认获取8K
  58. $downlen+=strlen($data);//累计已经下载的字节数
  59. fwrite($newf, $data, 1024 * 8 );
  60. echo "<script>setDownloaded($downlen);</script>";//在前台显示已经下载文件大小
  61. ob_flush();
  62. flush();
  63. }
  64. }
  65. if ($file) {
  66. fclose($file);
  67. }
  68. if ($newf) {
  69. fclose($newf);
  70. }
  71. }
  72. ?>
  73. </body>
  74. </html>

发表评论

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

发表评论前,请滑动滚动条解锁
三十岁