PHP is still relatively commonly used, so I studied the progress of PHP uploading files and shared it with you here. I hope it will be useful to everyone. The reason why it is difficult to implement an upload progress bar in PHP is because when we upload files to the server, we have to wait until all files are sent to the server before executing the corresponding PHP file. Before this, the file data was saved in a temporary file, and PHP could not obtain the path and size of this file.
APC implementation method of PHP file upload progress:
Install APC and refer to the official documentation for installation. You can use the PECL module installation method to quickly and easily configure PHP. There is no description here. ini, set the parameter apc.rfc1867=1 to enable APC to support the upload progress bar function. There are code examples in the APC source code description document:
<ol class="dp-xml"> <li class="alt"><span><span>if($_SERVER['REQUEST_METHOD']=='POST'){//上传请求 </span></span></li> <li class=""> <span>$</span><span class="attribute"><font color="#ff0000">status</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">apc_fetch</font></span><span>('upload_'.$_POST['APC_UPLOAD_PROGRESS']); </span> </li> <li class="alt"><span>$status['done']=1; </span></li> <li class=""><span>echojson_encode($status);//输出给用户端页面里的ajax调用,相关文档请自己寻找 </span></li> <li class="alt"><span>exit; </span></li> <li class=""><span>}elseif(isset($_GET['progress_key'])){//读取上传进度 </span></li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">status</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">apc_fetch</font></span><span>('upload_'.$_GET['progress_key']); </span> </li> <li class=""><span>echojson_encode($status); </span></li> <li class="alt"><span>exit; </span></li> <li class=""><span>}else{ </span></li> <li class="alt"><span>//其他代码,比如上传表单等 </span></li> <li class=""><span>} </span></li> </ol>
PHP upload progress module implementation method for file upload progress :
Use the PECL module installation method to install the module. Set uploadprogress.file.filename_template="/tmp/upd_%s.txt" in php.ini. Code example:
<ol class="dp-xml"> <li class="alt"><span><span>if($_SERVER['REQUEST_METHOD']=='POST'){ </span></span></li> <li class=""><span>if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ </span></li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">upload_dir</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">'your_path/'</font></span><span>; </span> </li> <li class=""> <span>$</span><span class="attribute"><font color="#ff0000">ext</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">strrchr</font></span><span>($_FILES['video']['name'],'.'); </span> </li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">sessid</font></span><span>=$_POST['UPLOAD_IDENTIFIER']; </span> </li> <li class=""> <span>$</span><span class="attribute"><font color="#ff0000">tmpfile</font></span><span>=$upload_dir.$sessid; </span> </li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">sessfile</font></span><span>=$upload_dir.$sessid.$ext; </span> </li> <li class=""><span>if(move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)){ </span></li> <li class="alt"><span>//上传成功 </span></li> <li class=""><span>}else{ </span></li> <li class="alt"><span>//上传失败 </span></li> <li class=""><span>}else{ </span></li> <li class="alt"><span>//上传错误 </span></li> <li class=""><span> </span></li> <li class="alt"><span>}elseif(!empty($_GET['sessid'])){ </span></li> <li class=""><span>header("Expires:Mon,26Jul199705:00:00GMT"); </span></li> <li class="alt"><span>header("Last-Modified:".gmdate("D,dMYH:i:s")."GMT"); </span></li> <li class=""><span>header("Cache-Control:no-store,no-cache,must-revalidate"); </span></li> <li class="alt"> <span>header("</span><span class="attribute"><font color="#ff0000">Cache-Control:post-check</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>,</span><span class="attribute"><font color="#ff0000">pre-check</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>",false); </span> </li> <li class=""><span>header("Pragma:no-cache"); </span></li> <li class="alt"> <span>header("Content-Type:text/html;</span><span class="attribute"><font color="#ff0000">charset</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">UTF</font></span><span>-8"); </span> </li> <li class=""><span> </span></li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">unique_id</font></span><span>=$_GET['sessid']; </span> </li> <li class=""> <span>$</span><span class="attribute"><font color="#ff0000">uploadvalues</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">uploadprogress_get_info</font></span><span>($unique_id); </span> </li> <li class="alt"><span> </span></li> <li class=""><span>if(is_array($uploadvalues)){ </span></li> <li class="alt"><span>echojson_encode($uploadvalues); </span></li> <li class=""><span>}else{ </span></li> <li class="alt"><span>//读取进度失败,另外处理逻辑 </span></li> <li class=""><span>} </span></li> <li class="alt"><span> </span></li> <li class=""><span>}else{ </span></li> <li class="alt"><span>//显示上传表单 </span></li> <li class=""><span>} </span></li> </ol>