Heim >Backend-Entwicklung >PHP-Tutorial >新手必看PHP上传文件进度全面揭秘_PHP教程

新手必看PHP上传文件进度全面揭秘_PHP教程

WBOY
WBOYOriginal
2016-07-15 13:27:25900Durchsuche

PHP还是比较常用的,于是我研究了一下PHP上传文件进度 ,在这里拿出来和大家分享一下,希望对大家有用。PHP之所以很难实现上传进度条是因为在我们上传文件到服务器的时候,要等到文件全部送到服务器之后,才执行相应的php文件。在这之前,文件数据保存在一个临时文件里面,而php无法获得这个文件的路径及大小。

从Actionscript 2.0开始,Flash支持文件上传及下载了。虽然不能在服务端获得文件上传进度,但我们可以在服务端获得文件的发送进度。根据这个原理,用Flash就能做出上传进度条效果。我在网上看到过一些资料,但是感觉有缺陷。于是自己研究了一下,在前人的基础上加强了程序的安全性和健壮性,并且增加了一些可自定义的参数。 目前我知道的方法有两种,一种是使用PHP的创始人RasmusLerdorf写的APC扩展模块来实现,另外一种方法是使用PECL扩展模块uploadprogress实现我这里举两个分别实现的例子供参考,更灵活的应用根据自己需要来修改。

PHP上传文件进度之APC实现方法

安装APC,参照官方文档安装,可以使用PECL模块安装方法快速简捷,这里不说明配置php.ini,设置参数apc.rfc1867=1,使APC支持上传进度条功能,在APC源码说明文档里面有说明代码范例:

<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上传文件进度之uploadprogress模块实现方法

使用PECL模块安装方法安装该模块php.ini里面设置uploadprogress.file.filename_template=“/tmp/upd_%s.txt”代码范例:

<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>

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/446544.htmlTechArticlePHP还是比较常用的,于是我研究了一下PHP上传文件进度 ,在这里拿出来和大家分享一下,希望对大家有用。PHP之所以很难实现上传进度条是...
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn