您当前的位置: 首页 > 学无止境 > 网站建设 网站首页网站建设
真正实现php通过apc扩展获取文件上传进度的方法
发布时间:2016-07-31 14:36:13编辑:雪饮阅读()
在研究了轩脉刃大神关于php通过apc扩展获得上传文件信息帖子时,发现一个问题。本人用的是window的phpstudy2016集成环境,php版本为5.3线程安全版。按照轩脉刃大神的做法发现每次只要开启了apc扩展后若file类型表单元素前面有那个隐藏域的apc标识存在时便不能正常上传文件,浏览器状态栏一直显示“等待localhost响应”字样。并且按照大神的方法去获取上传文件的状态信息也是无法获取的。
在仔细研读轩脉刃大神的帖子后发现用的apc版本是3.1.13.这边版本windows上面好像是没有的。遂安装centos虚拟机并配置了lamp环境。安装上php5.3+apc3.1.13然后重新实践大神的帖子。这次终于成功了。
总结:apc扩展兼容性并不是很好,而且其官方已经不予更新了。另外对于apc的上传文件状态信息中,你是无法获取到文件上传的即时速度的。文件的上传速度只有在文件上传结束了之后方能获取。
既然windows下面无法实现apc对文件上传状态信息的读取,那么久换做linux吧。
既然能够读取文件的上传状态,那么就可以写一个文件上传进度呈现给用户,这样会增加用户的体验性。基于以上原理,雪饮在这里写一个ajax的上传进度显示的demo:
前端:Untitled-1.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript">
function ajaxup(){
$("#xy_sc_select_file").hide();
$("#xy_sc_button").hide();
//创建iframe框架并将表单提交到iframe框架中
var ifname='up'+Math.random();
$('<iframe name="'+ifname+'" width="0" height="0" frameBorder="0"></iframe>').appendTo($('body'));
$('form:first').attr('target',ifname);
var t1=window.setInterval(function (){
$.ajax({
url:'getapc.php',
data:{data1:'value1',data2:'value2'},
type:'post',
cache:false,
dataType:'json',
success:function(data){
$("#jindu").html("文件总大小:"+data.total+"<br/>当前已上传:"+data.current+"<br/>进度:"+data.current/data.total*100+"%");
if(data.total==data.current){
window.clearInterval(t1);
}
}
});
},1000);
}
</script>
</head>
<body>
<center>
<div id="jindu"></div>
<form enctype="multipart/form-data" method="POST" action="apc.php" onsubmit="return ajaxup();">
<input type="hidden" name="APC_UPLOAD_PROGRESS" value="6226f7cbe59e99a90b5cef6f94f966fd"/>
<input type="file" name="file" id="xy_sc_select_file"/>
<input type="submit" value="submit" id="xy_sc_button"/>
</form>
</center>
</body>
</html>
后端:apc.php
<?php
if($_FILES['file']['error']==0){
if(move_uploaded_file($_FILES['file']['tmp_name'],$_SERVER['DOCUMENT_ROOT']."/xy/".$_FILES['file']['name'])){
echo 'sucess';
}
}
?>
后端:getapc.php
<?php
$jindu_arr=apc_fetch("upload_6226f7cbe59e99a90b5cef6f94f966fd");
echo json_encode($jindu_arr);
?>
现在让大家看看实现后的效果:
不过雪饮还遇到一个小bug(无伤大雅):就是在linux服务器内部,若你之前有文件通过ftp上传进去的中文文件会有文件名乱码的情况发生,若此时你没有重命名该乱码文件而在linux内部通过内部浏览器访问该demo并选择了该乱码文件进行上传则会导致上传的文件是0字节,以理推之应该是所有的乱码文件都无法正常上传的。目前还没有解决该bug。各位看官如果有所良策不妨分享下解决该bug的经验也好。虽然这种情况很少发生,但很难保证用户会不会选择乱码文件上传。所以能力争尽善尽美,就最好完美一些的好。小生再次谢过了。
废话不多说,下面将本次分享所使用到的一些工具原料以及demo分享给大家了:
配置lamp可能会用到的:链接:http://pan.baidu.com/s/1geZh8en 密码:r89s
demo:链接:http://pan.baidu.com/s/1hs15Og8 密码:v5ns
关键字词:apc,php,文件上传,进度