PHP_APC扩展dll上传大文件及进度条实例

 

1.弄好了 APC之后,就是使用它了,下面是个例子,是一个进度条 上传的例子,作为笔记记录下来

在这个例子之前,我们需要做如下的设置,如果我们需要上传的是大文件的话,请在您的php.ini文件中做如下的设置

apc.max_file_size = 200M
;修改以下几项,因为它原本不是这样,具体可以自己设定
upload_max_filesize = 1000M
post_max_size = 1000M
post_max_size = 1000M
max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 128M ;每个PHP页面所吃掉的最大内存,默认8M

这里需要说明,上面的配置必须在您已经确保安置完成并且测试成功APC正常运行之后进行设置,如果没有安置APC请看上篇文章的详细描述

设置完成上面这些东西,才可以正在进行进度条上传的例子程序

首先在我们进行进度条上传的例子之前,需要明白两件事情,这个远比给你代码更加的好,明白了原理之后,我们再进行说明如何弄个进度条

1.上传的原理:一定是一个form表单然后设置它的那个enctype="multipart/form-data"属性,一个method的post属性,如果是你是通过HTTP协

上传,一般都是这样

2.进度条原理:我们可以通过div模拟,给他一个外围的div是有边框,无背景色,里面的div有背景色无边框,这样,让里面的div宽度从0开始

,逐渐以百分比的形式增长,就模拟了进度条效果

3.核心:通过APC可以如这样apc_fetch('upload_'.$_GET['progress_key']);获得文件上传的状态,如文件总共多大,现在目前上传了多少。

上传速度是多大等,我们后面具体说明

扫描二维码关注公众号,回复: 6124723 查看本文章

4.难道:一个是APC获取需要一个唯一的上传id,第二,php脚本知道了文件大小等问题,但是JavaScript如何获取呢,这个时候需要用到Ajax

或者用jQuery封装一下用json传数据

ok,明白了原理和技术难点,你就会感觉,其实也不过如此,说来说去就是一个id,一个方法,其他的就是Ajax的了

好了,下面开始说如何代码实现,很多人喜欢从获取进度条的代码开始讲,但这样不好,因为进度条获取那里需要一个id号。你就不明白如何获取那个id号了

我喜欢从upload.php,也就是从用户看到的上传界面开始说东西,恩。那就从那开始,分析代码,代码是网上拉的例子,不过明白原理就ok

code:upload.php

分析如下:首先界面的html代码你总要会ok它吧。
<form enctype="multipart/form-data" id="upload_form" action="target.php" method="POST">  
    <input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?php echo $id?>"/>  
    <input type="file" id="upload_file" name="upload_file" /><br/>  
    <input type="submit" name="submit" value=" 上传 " class="button" style=" margin-left:150px; margin-top:30px;" onclick="startProgress(); return true;"/>

</form>
一个简单的上传表单,没什么好介绍的,说一些你可能感觉奇怪的东西和注意事项
1.enctype="multipart/form-data"   如果你是上传东西,这个是必须的,没什么好说
2.method="POST"   这个如果是上传,那就不能用get了
3.action="target.php"   表单的处理页面,自己设定一下
4.<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?php echo $id?>" /> 这是关键,id等一下会讲
5.红色部分一定要ok哦。否则你那个获取文件大小这些都没戏了。

然后呢,在你的这个上传网页代码的最上面,写上这样的代码

<?php
   session_start();
   $id = md5(uniqid(rand(), true));
?>

不用说,一个是启动你的session,一个是为了得到一个唯一的id号。你现在应该明白上面的id是哪里来的吧。对就是网页最上面这个代码产生的。

<input type="submit" name="submit" value=" 上传 " class="button" style=" margin-left:150px; margin-top:30px;" onclick="startProgress(); return true;"/>

看到上面的代码没有,它显然是调用了一个函数。这里我用了jQuery框架,大家可以自己去下载,然后引入即可。这里我也是弄出了和我看到的几个例子不同的地方的核心了。请看JavaScript代码

<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
<script language="javascript">
function getProgress(){
$.ajax({type:"GET",url:"getprogress.php",data:"progress_key=<?php echo $id;?>",success:function(msg){
    $("#upstatus").html(msg);
    var str = $("#upstatus").html();
    var arr = str.split(',');
    var arr1 = arr[0];
    var arr2 = arr[1];
    var arr3 = arr[2];
    getinfo(arr1,arr2,arr3);
   }
});
function getinfo(var1,var2,var3){
$("#progressinner").width(parseFloat(var1)+"%");
$("#upstatus").html('文件大小:'+var2+'KB'+'已上传:'+var3+'KB');
if (parseFloat(var1) < 100){
setTimeout(function(){
getProgress();
}, 10);
}else{
$("#upstatus").html("视频上传完成,正在处理数据,请稍后……");
}
}
}

function startProgress(){
$("#progressouter").css({ display:"block" });
setTimeout(function(){
getProgress();
}, 100);
}
</script>

相信聪明的你一看就可以明白我是怎么做的了。就是把那些服务器端那个getprogress.php文件传回来到数据进行用逗号分隔的字符串,然后调用JavaScript里面本来有的那个split方法进行把它搞成数组呵呵。就这么简单。下面说说核心的,如何获得文件的大小呢。就是我们的 getprogress.php文件在起作用了呵呵。

请看它的代码,非常简单的

<?php
session_start();

if(isset($_GET['progress_key'])) {
   $status = apc_fetch('upload_'.$_GET['progress_key']);
      $per = $status['current']/$status['total']*100;
      $total = round($status['total']/1024);
      $current = round($status['current']/1024);
      echo $per.','.$total.','.$current;
   
}
?>

对,核心就是apc_fetch('upload_'.$_GET['progress_key']); 的使用,就类似我们的java,new出来对象,那么就可以用很多方法一样,这里,它本身有很多的那个数组值,如current是已经上传的大小啊。 total是总共有多少大啊。什么这些东西,你都可以在网上百度一下php APC上传即可获得他们的详细说明,我就不废话了。请看 echo $per.','.$total.','.$current;

就是这个逗号连起来的字符串,然后我们的Ajax可以获取服务器的echo出来的东西,然后用split分割,那样我们不就可以得到结果了吗?现在看看那个JavaScript代码,是不是很明白了呢。呵呵。

还有一个界面性的东西,就是显示给用户看的那个了,就是我们上传了多少啊之类的 。

<div id="upjindu">
          <label for="jindu">上传进度:</label>
          <div id="upstatus" style="width: 500px; height: 30px; border: 1px solid #ffffde; color:#796140;"></div>
<div id="progressouter" style="width: 500px; height: 20px; border: 3px solid #00C; display:none;">
<div id="progressinner" style="height: 20px; color:#06F; width: 0%; text-align:left; float:left;"></div>
</div>

          </div>

猜你喜欢

转载自www.cnblogs.com/wangxiaoy/p/10812835.html
今日推荐