本文实例讲述了PHP+apc+ajax实现的ajax_upload上传进度条代码。分享给大家供大家参考,具体如下:
上传进度条是怎么实现的呢?原理是怎么样的呢?当我们浏览,选择上传后,会产生一个临时文件,上传的时把这个临时文件,上传到服务器,上传完成后,这个临时文件会被删除掉。如果我们能读取这个临时文件的大小,就知道上传进度是多少了,php apc模块可以实现这个功能。
一、安装apc模块
下载地址:http://pecl.php.net/package/apc
1
2
3
4
5
|
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
1
2
3
4
5
6
7
8
|
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或者其他,查看一下
1
2
3
4
5
6
7
8
9
10
|
[root@BlackGhost php]# php -m
[PHP Modules]
apc
cgi-fcgi
ctype
curl
date
dom
eAccelerator
。。。。。。。。
|
三、upload_test.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?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文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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上传文件
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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调用用的
1
2
3
4
5
6
7
8
9
10
|
<?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 上传进度条
参数说明:
total 文件大小
current 已上传的大小
filename 上传文件名
name 标签名
done 上传成功为1
cancel_upload 用户取消上传,只有上传完成时才有
rate 上传速度,只有上传完成时才有
start_time 开始时间
希望本文所述对大家PHP程序设计有所帮助。