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']);获得文件上传的状态,如文件总共多大,现在目前上传了多少。
上传速度是多大等,我们后面具体说明
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>
PHP_APC扩展dll上传大文件及进度条实例的更多相关文章
- Asp.Net上传大文件带进度条swfupload
		Asp.Net基于swfupload上传大文件带进度条百分比显示,漂亮大气上档次,大文件无压力,先看效果 一.上传效果图 1.上传前界面:图片不喜欢可以自己换 2.上传中界面:百分比显示 3.上传后返 ... 
- JS原生上传大文件显示进度条-php上传文件
		JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M post_max_size = 10M memory_li ... 
- QQ上传大文件为什么这么快
		今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ... 
- java-plupload上传大文件
		参考链接: https://blog.csdn.net/hjf_1291030386/article/details/74784172 https://www.cnblogs.com/tengyunh ... 
- tornado上传大文件以及多文件上传
		tornado上传大文件问题解决方法 tornado默认上传限制为低于100M,但是由于需要上传大文件需求,网上很多说是用nginx,但我懒,同时不想在搞一个服务了. 解决方法: server = H ... 
- Github上传大文件(超过100M)
		上传大文件(超过100M)到Github 笔者上传操作100M的文件到Github,结果在push的时候会自动终止.然后提示无法上传大文件,就算删除再提交也是报错. 于是,本人写这篇博客就是为了解决这 ... 
- asp.net core流式上传大文件
		asp.net core流式上传大文件 首先需要明确一点就是使用流式上传和使用IFormFile在效率上没有太大的差异,IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何 ... 
- web页面上传大文件有没有好的解决方案
		本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ... 
- [Asp.net]Uploadify上传大文件,Http error 404 解决方案
		引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章:[Asp.net]Upl ... 
随机推荐
- LINUX常见服务列表
			服务名 必需(是/否)用途描述 注解 acon 否 语言支持 特别支持左手书写语言:阿拉伯语,波斯语和希伯莱语 acpi ... 
- 【CODEVS】2833 奇怪的梦境
			2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很 ... 
- js里面的this指向
			1. this是动态绑定的,或者说是在代码运行期绑定而不是在书写期 function fire () { console.log(this.a) } var obj = { a: 1, fire: ... 
- php语言的核心知识点
			PHP:脚本语言,网站建设,服务器端运行PHP定义:一种服务器端的 HTML 脚本/编程语言,是一种简单的.面向对象的.解释型的.健壮的.安全的.性能非常之高的.独立于架构的.可移植的.动态的脚本语言 ... 
- JavaCollection
			http://blog.csdn.net/itlwc/article/details/10148321 http://blog.sina.com.cn/s/blog_6d6f5d7d0100s9nu. ... 
- Docker for windows pull镜像文件的安装位置改变方法
			发生现象: 在windows10下安装docker for windows,随着用docker pull image文件后,C盘的容量越来越小了,你可能也有一种跟我一样的想法,想改变默认的安装路径,本 ... 
- ORACLE 日常维护命令手册
			1查看数据库版本SELECT * FROM V$VERSION; 2查看数据库语言环境SELECT USERENV('LANGUAGE') FROM DUAL; 3查看ORACLE实例状态SELECT ... 
- 阿里云DDoS高防的演进:防御效果成核心
			分布式拒绝服务(DDoS)攻击这一网络公敌,是任何互联网业务的重大威胁.随着DDoS攻击工具化的发展,无论是简单野蛮的流量型攻击,还是复杂精巧的应用型攻击,黑客发起DDoS攻击变得越来越简单和自动化. ... 
- Precision和Recall
			学习自: http://blog.csdn.net/wangran51/article/details/7579100 
- JAVA高级特性--String/StringBuffer/Builder
			String String对象一旦创建就不能改变 是常量 需要进行大量字符串操作应采用StringBuffer/StringBuilder 最终结果转换成String对象 StringBuffer ... 
