在PHP5.4以前, 我们可以通过APC提供的功能来实现. 或者使用PECL扩展uploadprogress来实现. 虽然说, 它们能很好的解决现在的问题, 但是也有很明显的不足: 1. 他们都需要额外安装(我们并没有打算把APC加入PHP5.4) 2. 它们都使用本地机制来存储这些信息, APC使用共享内存, 而uploadprogress使用文件系统(不考虑NFS), 这在多台前端机的时候会造成麻烦. 程序需要php的apc模块的支持,关键点就是在上传的form里添加一个hidden的inpu标签,里面要有name为 APC_UPLOAD_PROGRESS的属性,value值为一个随机数一遍多个人上传。 apc模块的安装方法是,下载php_apc.dll放到ext文件夹下,在php.ini文件里添加 upload_max_filesize =100M apc.rfc1867 = on apc.max_file_size = 100M extension=php_apc.dll 然后测试配置是否成功: if(apc_fetch) {echo "apc is working"} else{echo "apc is not supported!";} 运行效果截图 下面是源码 1 前台页面:
PHP+Ajax带进度条文件上传 2后台upload.php文件代码: <?php /* * Created on 2010-4-16 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ if ($_SERVER['REQUEST_METHOD'] == 'POST'){ $myfile=$_FILES['upfile']; echo $myfile['size']; echo $myfile['size']; print_r($myfile); $tempf=$myfile['tmp_name']; $name=$myfile['name']; move_uploaded_file($tempf,'up/'.$name);} if(isset($_GET['key'])) { //header('Content-Type:application/json; charset=utf-8' ) ; // Retrieve the status using the getStatus() function below //echo json_encode(getStatusAPC()); echo json_encode(getStatusAPC()); } function getStatusAPC() { $response=false; if($status = apc_fetch('upload_'.$_GET['key'])) { $response=apc_fetch('upload_'.$_GET['key']); } return $response; } ?> 问题总结: 1,使用setTimeout嵌套和setInterval有区别,用前者效果较好,用后者的话由于请求和返回的时间比较随机,时间间隔把握不好的话,程序会比较混乱,结果往往不正确。 2.发送Ajax请求时每次都要重新实例化xmlhttprequest对象而不能用上次实例化的,否则程序在ie下无法执行,在火狐下可以运行php带进度上传,php上传带进度
最新推荐文章于 2021-11-17 18:45:35 发布