php 大文件带进度的上传,一直是一个令php程序员很苦恼的问题。查询baidu 、Google ,大体做带进度的上传方式为:flash+php,socket,apc+php等,下面我介绍了apc +php+ajax制作的带进度的上传,并贴出源码,希望对大家有用。
Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。
在使用apc时候,先必须使用安装apc 模块。
第一步:下载php_apc.dll
第二步:让php.ini支持apc扩展模块。
将php_apc.dll放入你的ext目录,然后打开php.ini 加入:
extension=php_apc.dll
apc.rfc1867 = on
apc.max_file_size = 100M
upload_max_filesize = 100M
post_max_size = 100M
//以上参数可自己定义
第三步:检查是否支持PHP APC
if (function_exists(\'apc_fetch\')) { echo \'it surpport apc model!\'; } else { echo \"it\'s not support apc model!\"; } ?>
下面进入正题:
原理:通过APC 模块,用ajas从缓存中读取上传的进度。详见:
index.php
<?php $unid=uniqid(\"\");//确定唯一标致,实现多人同时上传 ?> <div class=\"userinput2\"> <div id=\"captions\">先将你要上传的软件上传服务器,上传时请耐心等候...<span class=\"style1\"><br /> </span> <script type=\"text/javascript\" > var xmlHttp; var proNum=0; var loop=0; //初始化xmlHttp function createxml(){ var xmlHttp; if(window.XMLHttpRequest){ xmlHttp=new XMLHttpRequest(); }else{ xmlHttp=new ActiveXObject(\"Microsoft.XMLHTTP\"); } return xmlHttp; } xmlHttp=createxml(); //ajas操作 function sendURL() { var url=\"getprogress.php?progress_key=<?php echo $unid;?>\"; xmlHttp.open(\"GET\",url,false); if (window.navigator.userAgent.indexOf(\"Firefox\")>=1){ //如果是firefox3.0 xmlHttp.send(\"progress_key=<?php echo $unid;?>\"); if(xmlHttp.status==200) doHttpReadyStateChange(); }else{ xmlHttp.onreadystatechange = doHttpReadyStateChange; xmlHttp.send(\"progress_key=<?php echo $unid;?>\"); } } //回调函数 function doHttpReadyStateChange() { if (xmlHttp.readyState== 4){ proNum=parseInt(xmlHttp.responseText); //alert(proNum); document.getElementByIdx_x(\"progressinner\").style.width = proNum+\"%\"; document.getElementByIdx_x(\"showNum\").innerHTML = proNum+\"%\"; if ( proNum < 100){ setTimeout(\"sendURL()\", 200); }else{ //上传成功后,还不能及时得到信息。还希望高人指点 document.getElementByIdx_x(\"progressouter\").style.display=\"none\"; document.getElementByIdx_x(\"progressinner\").style.display=\"none\"; document.getElementByIdx_x(\"showNum\").style.display=\"none\"; document.getElementByIdx_x(\"theframe\").style.display=\"none\"; document.getElementByIdx_x(\"link2\").style.display=\"block\"; } } } function startProgress(){ document.getElementByIdx_x(\"progressouter\").style.display=\"block\"; setTimeout(\"sendURL()\", 200); } function newsofturl(text){ document.getElementByIdx_x(\"link2\").style.display=\"block\"; document.getElementByIdx_x(\"link2\").value=text; } </script> <iframe id=\"theframe\" name=\"theframe\" src=\"softupload.php?id=<?php echo($unid); ?>\" style=\"border: 0; height: 80px; width: 400px; \" frameborder=\"0\" scrolling=\"no\" > </iframe> <input name=\"linkdefult\" type=\"hidden\" id=\"linkdefult\" value=\"0\" /> <br /> <div id=\"link2\" style=\"display:none;\" > <font size=2>上传成功! 文件大小为: <input type=\"text\" name=\"filesize\" id=\"filesize\" style=\"width:50px;\"/> </font><br> <br> <font size=2>文件下载地址为:</font><br /> <input type=text name=\'link\' id=\'link\' style=\'width:380px;\' /> </div> <br/> <div id=\"progressouter\" style=\"width: 500px; height: 20px; border: 1px solid #000000; display:none;\"> <div id=\"progressinner\" style=\"position: relative; height: 20px; background-color: #333333; width: 0%; \"></div> </div> <div id=\'showNum\' style=\"font-size:12px; color:#333333\"></div> </div> </div>
softupload.php
<?php $id = $_GET[\'id\']; ?> <script language=\"javascript\"> //Trim the input text function Trim(input) { var lre = /^\\s*/; var rre = /\\s*$/; input = input.replace(lre, \"\"); input = input.replace(rre, \"\"); return input; } function CheckForTestFile() { var file = document.getElementByIdx_x(\'Softfile\'); var fileName=file.value; //Checking for file browsed or not if (Trim(fileName) ==\'\' ) { alert(\"请为上传选择一个文件!!!\"); file.focus(); return false; } //Setting the extension array for diff. type of text files var extArray = new Array(\".rar\", \".zip\", \".exe\", \".gz\"); //getting the file name while (fileName.indexOf(\"\\\") != -1) fileName = fileName.slice(fileName.indexOf(\"\\\") + 1); //Getting the file extension var ext = fileName.slice(fileName.indexOf(\".\")).toLowerCase(); for (var i = 0; i < extArray.length; i++) { if (extArray[i] == ext) { window.parent.startProgress(); return true; } } alert(\"正确的文件格式为\" + (extArray.join(\" \")) + \"\\n请选择一个新的 \" + \"文件提交上传.\"); file.focus(); return false; } </script> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" /> <form enctype=\"multipart/form-data\" id=\"upload_form\" action=\"target.php\" method=\"POST\"> <input type=\"hidden\" name=\"APC_UPLOAD_PROGRESS\" id=\"progress_key\" value=\"<?php echo $id?>\"/> <table width=\"322\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"linkTable\"> <tr> <td >1.选择软件<br /> <input name=\"Softfile\" type=\"file\" id=\"Softfile\" /></td> <td ><br /> <input name=\"submit\" type=\"submit\" onclick=\"return CheckForTestFile();\" value=\"上传软件\"/></td> </tr> </table> </form>
target.php
<script language=\"javascript\"> //将上传后的信息返还给父窗口 function chuanzhi(){ parent.document.getElementByIdx_x(\'filesize\').value=document.getElementByIdx_x(\'size\').value; parent.document.getElementByIdx_x(\'link\').value=document.getElementByIdx_x(\'newsoftdir\').value; parent.document.getElementByIdx_x(\'linkdefult\').value=1; } </script> <body onLoad=\"chuanzhi();\"> <?php //header(\'Content-Type:text/html;charset=gb2312\'); define(\'SOFTDIR\', \"./upload/\"); //上传后路径 define(\'HTTPSOFTDIR\', \"http://www.mysite.com/\"); //服务器的路径 //判断上传软件后缀名是否允许 function isSoftExt($extension) { $ext = array(\'exe\', \'rar\', \'zip\',\'gz\'); return in_array($extension, $ext) ? true : false; } if($_SERVER[\'REQUEST_METHOD\']==\'POST\'){ $errors[\'0\'] = true; $errors[\'1\'] = \'请选择上传的软件图片\'; $errors[\'2\'] = \'上传软件图片失败\'; $errors[\'3\'] = \'上传软件图片失败\'; $daytime = date(\'Y-m-d-h-m-s\'); $timename=str_replace(\"-\",\"\",$daytime); //取得当天的日期时间 //检查软件是否是正常上传的 if(!is_uploaded_file($_FILES[\'Softfile\'][\'tmp_name\'])) { echo \"<script>alert(\'非正常上传!\');history.back();</script>\"; exit; } $extension = pathinfo($_FILES[\'Softfile\'][\'name\'], PATHINFO_EXTENSION); $filename = $timename.\"_\".$_FILES[\'Softfile\'][\'name\']; $tmpsize=$_FILES[\'Softfile\'][\'size\']; $msize=round($tmpsize/1048576 , 2) .\"M\"; $ksize=round($tmpsize/1024 ,2). \"K\"; $filesize =$tmpsize>1048576?$msize:$ksize; //检查软件文件格式 if(!isSoftExt($extension)) { echo \"<script>alert(\'上传的软件格式有错误!\');history.back();</script>\"; exit; } //移动软件 if(!move_uploaded_file($_FILES[\'Softfile\'][\'tmp_name\'], SOFTDIR. $filename)) { echo \"<script>alert(\'移动软件出错!\');history.back();</script>\"; exit; }else{ echo \"<font size=2>上传成功! 文件大小为:<input type=text id=\'size\' value=\'$filesize\'></font><br>\"; echo \"<font size=2>文件下载地址为:</font><input type=text id=\'newsoftdir\' value=\'\".HTTPSOFTDIR.$filename.\"\' style=\'width=380\'>\"; } }else echo \"请不要直接输入地址!\"; ?>
getprogress.php
<?php //上传ajas获取进度页面 session_start(); if(isset($_GET[\'progress_key\'])) { $status = apc_fetch(\'upload_\'.$_GET[\'progress_key\']); echo ($status[\'current\']/$status[\'total\'])*100; } echo \'APC_FILE=\'.APC_FILE; ?>
本文为大家提供了一个php制作带进度上传文件的思路,可能还有一些欠缺的地方,希望大家进行补充,或者是再结合小编之前整理的文章进行学习,希望对大家的学习有所帮助。
本文地址:https://www.stayed.cn/item/21876
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我