PHP利用APC模块实现大文件上传进度条的方法
php大文件带进度的上传,一直是一个令php程序员很苦恼的问题。查询baidu、Google,大体做带进度的上传方式为:flash+php,socket,apc+php等,下面我介绍了apc+php+ajax制作的带进度的上传,并贴出源码,希望对大家有用。
AlternativePHPCache(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
//以上参数可自己定义
第三步:检查是否支持PHPAPC
if(function_exists('apc_fetch')){ echo'itsurpportapcmodel!'; }else{ echo"it'snotsupportapcmodel!"; } ?>
下面进入正题:
原理:通过APC模块,用ajas从缓存中读取上传的进度。详见:
index.php
<?php $unid=uniqid("");//确定唯一标致,实现多人同时上传 ?> <divclass="userinput2"> <divid="captions">先将你要上传的软件上传服务器,上传时请耐心等候...<spanclass="style1"><br/> </span> <scripttype="text/javascript"> varxmlHttp; varproNum=0; varloop=0; //初始化xmlHttp functioncreatexml(){ varxmlHttp; if(window.XMLHttpRequest){ xmlHttp=newXMLHttpRequest(); }else{ xmlHttp=newActiveXObject("Microsoft.XMLHTTP"); } returnxmlHttp; } xmlHttp=createxml(); //ajas操作 functionsendURL(){ varurl="getprogress.php?progress_key=<?phpecho$unid;?>"; xmlHttp.open("GET",url,false); if(window.navigator.userAgent.indexOf("Firefox")>=1){ //如果是firefox3.0 xmlHttp.send("progress_key=<?phpecho$unid;?>"); if(xmlHttp.status==200)doHttpReadyStateChange(); }else{ xmlHttp.onreadystatechange=doHttpReadyStateChange; xmlHttp.send("progress_key=<?phpecho$unid;?>"); } } //回调函数 functiondoHttpReadyStateChange(){ 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"; } } } functionstartProgress(){ document.getElementByIdx_x("progressouter").style.display="block"; setTimeout("sendURL()",200); } functionnewsofturl(text){ document.getElementByIdx_x("link2").style.display="block"; document.getElementByIdx_x("link2").value=text; } </script> <iframeid="theframe"name="theframe"src="softupload.php?id=<?phpecho($unid);?>"style="border:0;height:80px;width:400px;"frameborder="0"scrolling="no"></iframe> <inputname="linkdefult"type="hidden"id="linkdefult"value="0"/> <br/> <divid="link2"style="display:none;"><fontsize=2>上传成功! 文件大小为: <inputtype="text"name="filesize"id="filesize"style="width:50px;"/> </font><br> <br> <fontsize=2>文件下载地址为:</font><br/> <inputtype=textname='link'id='link'style='width:380px;'/> </div> <br/> <divid="progressouter"style="width:500px;height:20px;border:1pxsolid#000000;display:none;"> <divid="progressinner"style="position:relative;height:20px;background-color:#333333;width:0%;"></div> </div> <divid='showNum'style="font-size:12px;color:#333333"></div> </div> </div>
softupload.php
<?php $id=$_GET['id']; ?> <scriptlanguage="javascript"> //Trimtheinputtext functionTrim(input) { varlre=/^\s*/; varrre=/\s*$/; input=input.replace(lre,""); input=input.replace(rre,""); returninput; } functionCheckForTestFile() { varfile=document.getElementByIdx_x('Softfile'); varfileName=file.value; //Checkingforfilebrowsedornot if(Trim(fileName)=='') { alert("请为上传选择一个文件!!!"); file.focus(); returnfalse; } //Settingtheextensionarrayfordiff.typeoftextfiles varextArray=newArray(".rar",".zip",".exe",".gz"); //gettingthefilename while(fileName.indexOf("\")!=-1) fileName=fileName.slice(fileName.indexOf("\")+1); //Gettingthefileextension varext=fileName.slice(fileName.indexOf(".")).toLowerCase(); for(vari=0;i<extArray.length;i++) { if(extArray[i]==ext) { window.parent.startProgress();returntrue; } } alert("正确的文件格式为"+(extArray.join(""))+"\n请选择一个新的"+"文件提交上传."); file.focus(); returnfalse; } </script><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/> <formenctype="multipart/form-data"id="upload_form"action="target.php"method="POST"> <inputtype="hidden"name="APC_UPLOAD_PROGRESS"id="progress_key"value="<?phpecho$id?>"/> <tablewidth="322"border="0"cellpadding="0"cellspacing="0"id="linkTable"> <tr> <td>1.选择软件<br/> <inputname="Softfile"type="file"id="Softfile"/></td> <td><br/> <inputname="submit"type="submit"onclick="returnCheckForTestFile();"value="上传软件"/></td> </tr> </table> </form>
target.php
<scriptlanguage="javascript"> //将上传后的信息返还给父窗口 functionchuanzhi(){ 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> <bodyonLoad="chuanzhi();"> <?php //header('Content-Type:text/html;charset=gb2312'); define('SOFTDIR',"./upload/");//上传后路径 define('HTTPSOFTDIR',"http://www.mysite.com/");//服务器的路径 //判断上传软件后缀名是否允许 functionisSoftExt($extension){ $ext=array('exe','rar','zip','gz'); returnin_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"<fontsize=2>上传成功! 文件大小为:<inputtype=textid='size'value='$filesize'></font><br>"; echo"<fontsize=2>文件下载地址为:</font><inputtype=textid='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制作带进度上传文件的思路,可能还有一些欠缺的地方,希望大家进行补充,或者是再结合小编之前整理的文章进行学习,希望对大家的学习有所帮助。