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 相关文章推荐
PHP里的中文变量说明
Jul 23 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
redis 队列操作的例子(php)
Apr 12 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
yii实现图片上传及缩略图生成的方法
Dec 04 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
php实现微信小程序授权登录功能(实现流程)
Nov 13 PHP
PHP sdk文档处理常用代码示例解析
Dec 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
强制设为首页代码
2006/06/19 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
python自动zip压缩目录的方法
2015/06/28 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
Python实现的桶排序算法示例
2017/11/29 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Python实现图片添加文字
2019/11/26 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
简约控的天堂:The Undone
2016/12/21 全球购物
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
Linux如何为某个操作添加别名
2015/02/05 面试题
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript