PHP+apc+ajax实现的ajax_upload上传进度条代码


Posted in PHP onJanuary 25, 2016

本文实例讲述了PHP+apc+ajax实现的ajax_upload上传进度条代码。分享给大家供大家参考,具体如下:

上传进度条是怎么实现的呢?原理是怎么样的呢?当我们浏览,选择上传后,会产生一个临时文件,上传的时把这个临时文件,上传到服务器,上传完成后,这个临时文件会被删除掉。如果我们能读取这个临时文件的大小,就知道上传进度是多少了,php apc模块可以实现这个功能。

一、安装apc模块

下载地址:http://pecl.php.net/package/apc

tar zxvf APC-3.1.8.tgz
cd APC-3.1.8/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

二、修改php.ini

extension = apc.so
apc.rfc1867 = 1
apc.max_file_size = 200M
upload_max_filesize = 1000M
post_max_size = 1000M
max_execution_time = 600
max_input_time = 600
memory_limit = 128M

修改好后,重起apache或者其他,查看一下

[root@BlackGhost php]# php -m
[PHP Modules]
apc
cgi-fcgi
ctype
curl
date
dom
eAccelerator
。。。。。。。。

三、upload_test.php

<?php
$id = uniqid(rand(), true);
?>
<html>
<script type='text/javascript' src='jquery-1.3.2.js'></script>
<script type='text/javascript' src='ajaxupload.3.1.js'></script>
<script type='text/javascript' src='upload.js'></script>
<body style="text-align:center;">
<h1>上传测试</h1><form enctype="multipart/form-data" id="upload" method="POST">
<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?=$id?>" />
<input type="file" id="file" name="file" value=""/><br/><input id="submit" type="submit" value="Upload!" />
</form>
<div id="progressouter" style="width: 500px; height: 20px; border: 1px solid black; display:none;">
<div id="progressinner" style="position: relative; height: 20px; background-color: red; width: 0%; ">
</div>
</div>
<br />
<div id='showNum'></div><br>
<div id='showInfo'></div><br>
</body>
</html>
<script type="text/javascript">
$(document).ready(function(){
form_submit();
});
</script>

APC_UPLOAD_PROGRESS这个有什么用呢?它对上传的文件添加一个标记,就可以在其它的php程序中用这个标记访问它。为apc的读取提供支持。

upload.js异步上传的js文件:

function form_submit (){
new AjaxUpload('#upload', {
action: 'upload.php',
name: 'file',
data: {
APC_UPLOAD_PROGRESS:$("#progress_key").val()
},
autoSubmit: true,
onSubmit: function(file, extension){
$('#progressouter').css('display', 'block');
progress();
},
onComplete: function(file, response){
$("#showInfo").html(response);
}
});
}
function progress (){
$.ajax({
type: "GET",
url: "progress.php?progress_key="+$("#progress_key").val(),
dataType: "json",
cache:false,
success: function(data){
if(data == 0) {
var precent = 0;
} else {
for (i in data) {
if (i == "current") {
var json_current = parseInt(data[i]);
}
if (i == "total") {
var json_total = parseInt(data[i]);
}
}
var precent = parseInt(json_current/json_total * 100);
$("#progressinner").css("width",precent+"%");
$("#showNum").html(precent+"%");
$("#showInfo").html("ok");
}
if ( precent < 100) {
setTimeout("progress()", 100);
}
}
});
}

上面有一点要注意,APC_UPLOAD_PROGRESS:$("#progress_key").val()在这里,key是APC_UPLOAD_PROGRESS如果不是这个的话,apc找不到临时文件的。在这里我为什么要用ajax_upload.js呢,因为jquery自带的ajax,自带参数没有上传文件的,也就是type='file'中的内容,php端根本得不到。

四、upload.php上传文件

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(empty($_FILES["file"]["tmp_name"])){
echo "no file";
die;
}
$tmp_name = $_FILES["file"]["tmp_name"];
$name = dirname($_SERVER['SCRIPT_FILENAME'])."/upload/".$_FILES["file"]["name"];
move_uploaded_file($tmp_name, $name);
echo "<p>File uploaded.</p>";
}
?>

如果文件比较大,就不要用http的方式来上传了,太慢,并且影响网站的稳定性。

五、progress.php取得进度的文件,给ajax调用用的

<?php
if(isset($_GET['progress_key'])) {
$status = apc_fetch('upload_'.$_GET['progress_key']);
if($status['total']!=0 && !empty($status['total'])) {
echo json_encode($status);
} else {
echo 0;
}
}
?>

看一下,ajax 异步请求产生的数据。

PHP+apc+ajax实现的ajax_upload上传进度条代码

php apc ajax 上传进度条

参数说明:

total           文件大小
current       已上传的大小
filename     上传文件名
name          标签名
done          上传成功为1
cancel_upload      用户取消上传,只有上传完成时才有
rate 上传速度,只有上传完成时才有
start_time   开始时间

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
php设计模式之观察者模式的应用详解
May 21 PHP
CI框架中zip类应用示例
Jun 17 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP获取不了React Native Fecth参数的解决办法
Aug 26 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
PHP实现的日历功能示例
Sep 01 PHP
PHP7 list() 函数修改
Mar 09 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 PHP
PHP实现的oracle分页函数实例
Jan 25 #PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 #PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 #PHP
crontab无法执行php的解决方法
Jan 25 #PHP
win7安装php框架Yii的方法
Jan 25 #PHP
php结合md5实现的加密解密方法
Jan 25 #PHP
PHP几个实用自定义函数小结
Jan 25 #PHP
You might like
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
Python 迭代器工具包【推荐】
2016/05/06 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python的concat等多种用法详解
2018/11/28 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
python Pillow图像处理方法汇总
2019/10/16 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
利用Python优雅的登录校园网
2020/10/21 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
毕业自我评价范文
2013/11/17 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
春节慰问简报
2015/07/21 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL