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 相关文章推荐
session 的生命周期是多长
Oct 09 PHP
第十二节--类的自动加载
Nov 16 PHP
用PHP控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
php将文本文件转换csv输出的方法
Dec 31 PHP
php实现的RSS生成类实例
Apr 23 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
thinkphp3.2.0 setInc方法 源码全面解析
Jan 29 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
在 PHP 和 Laravel 中使用 Traits的方法
Nov 13 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
javascript Array.remove() 数组删除
2009/08/06 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
jquery常用操作小结
2014/07/21 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
js+html制作简单验证码
2017/02/16 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
python开发入门——set的使用
2020/09/03 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
资产评估专业学生的自我鉴定
2013/11/14 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
目标责任书范本
2014/04/16 职场文书
群众路线领导对照材料
2014/08/23 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
安全隐患整改报告
2014/11/06 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
文明礼貌主题班会
2015/08/14 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
实习报告怎么写
2019/06/20 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android