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上传大文件及进度条实例的更多相关文章

  1. Asp.Net上传大文件带进度条swfupload

    Asp.Net基于swfupload上传大文件带进度条百分比显示,漂亮大气上档次,大文件无压力,先看效果 一.上传效果图 1.上传前界面:图片不喜欢可以自己换 2.上传中界面:百分比显示 3.上传后返 ...

  2. JS原生上传大文件显示进度条-php上传文件

    JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M    post_max_size = 10M    memory_li ...

  3. QQ上传大文件为什么这么快

    今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...

  4. java-plupload上传大文件

    参考链接: https://blog.csdn.net/hjf_1291030386/article/details/74784172 https://www.cnblogs.com/tengyunh ...

  5. tornado上传大文件以及多文件上传

    tornado上传大文件问题解决方法 tornado默认上传限制为低于100M,但是由于需要上传大文件需求,网上很多说是用nginx,但我懒,同时不想在搞一个服务了. 解决方法: server = H ...

  6. Github上传大文件(超过100M)

    上传大文件(超过100M)到Github 笔者上传操作100M的文件到Github,结果在push的时候会自动终止.然后提示无法上传大文件,就算删除再提交也是报错. 于是,本人写这篇博客就是为了解决这 ...

  7. asp.net core流式上传大文件

    asp.net core流式上传大文件 首先需要明确一点就是使用流式上传和使用IFormFile在效率上没有太大的差异,IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何 ...

  8. web页面上传大文件有没有好的解决方案

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  9. [Asp.net]Uploadify上传大文件,Http error 404 解决方案

    引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章:[Asp.net]Upl ...

随机推荐

  1. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  2. 洛谷P1062 数列 [2017年6月计划 数论03]

    P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… ...

  3. 利用InformationSchema与阿里云交易和账单管理API实现MaxCompute费用对账分摊统计

    利用MaxCompute InformationSchema与阿里云交易和账单管理API 实现MaxCompute费用对账分摊统计 一.需求场景分析 很多的企业用户选择MaxCompute按量付费模式 ...

  4. HDU 2686 双进程DP

    //第一次遇到这种DP,看大牛的博客都是用最大流求解的...dp[k][i][j] 表示走k步,第一条路线横向走了i步,第二条路线横向走了j步,所获得的最大值.. //转移方程也很好想 #includ ...

  5. C# Socket流数据大小端读写封装

      网络数据是大端模式,而c#中的数据小端结构,那么在读写网络数据的时候需要进行转换.c#类库IPAddress已经封装了大小端的转换. 封装代码如下: using System.IO; using  ...

  6. C++学习笔记----3.2 C++引用在本质上是什么,它和指针到底有什么区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...

  7. Codeforces Round #410 (Div. 2) A. Mike and palindrome【判断能否只修改一个字符使其变成回文串】

    A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  8. mysql的三种连接方式

    SQL的三种连接方式分为:左外连接.右外连接.内连接,专业术语分别为:LEFT JOIN.RIGHT JOING.INNER JOIN 内连接INNER JOIN:使用比较运算符来根据指定的连接的每个 ...

  9. C++之自定义key类型,重载操作符

    #include <map>#include <string>using namespace std;class MyString{ public:MyString(){m_s ...

  10. LintCode A+B问题

    给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 说明 a和b都是 32位 整数么? 是的 我可以使用位运算符么? 当然可以 样例 如果 a=1 并且 b=2,返回3 1.(忽略进位 ...