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 相关文章推荐
ezSQL PHP数据库操作类库
May 16 PHP
PHP基础学习小结
Apr 17 PHP
php URL跳转代码 减少外链
Jun 25 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
PHP 导出Excel示例分享
Aug 18 PHP
php递归遍历删除文件的方法
Apr 17 PHP
php输出图像的方法实例分析
Feb 16 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 PHP
PHP 实现base64编码文件上传出现问题详解
Sep 01 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
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
深入php self与$this的详解
2013/06/08 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
jquery构造器的实现代码小结
2011/05/16 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
python实现五子棋游戏
2019/06/18 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
收入及婚姻状况证明
2014/11/20 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL