PHP利用APC模块实现大文件上传进度条的方法


Posted in PHP onOctober 29, 2015

php 大文件带进度的上传,一直是一个令php程序员很苦恼的问题。查询baidu 、Google ,大体做带进度的上传方式为:flash+php,socket,apc+php等,下面我介绍了apc +php+ajax制作的带进度的上传,并贴出源码,希望对大家有用。
Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。 

在使用apc时候,先必须使用安装apc 模块。
第一步:下载php_apc.dll

第二步:让php.ini支持apc扩展模块。
将php_apc.dll放入你的ext目录,然后打开php.ini 加入:
     extension=php_apc.dll
     apc.rfc1867 = on
     apc.max_file_size = 100M
     upload_max_filesize = 100M
     post_max_size = 100M
     //以上参数可自己定义 

第三步:检查是否支持PHP APC

if (function_exists('apc_fetch')) {
 echo 'it surpport apc model!';
 } else {
 echo "it's not support apc model!";
 }
 ?>

下面进入正题:
原理:通过APC 模块,用ajas从缓存中读取上传的进度。详见:
 index.php 

<?php
 $unid=uniqid("");//确定唯一标致,实现多人同时上传
?>
<div class="userinput2">
 <div id="captions">先将你要上传的软件上传服务器,上传时请耐心等候...<span class="style1"><br />
 </span>
 <script type="text/javascript" >
 var xmlHttp;
 var proNum=0;
 var loop=0;
 //初始化xmlHttp
 function createxml(){
 var xmlHttp;
 if(window.XMLHttpRequest){
 xmlHttp=new XMLHttpRequest();
 }else{
 xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
 }
 return xmlHttp;
 }
 xmlHttp=createxml();
 //ajas操作
 function sendURL() {
 var url="getprogress.php?progress_key=<?php echo $unid;?>";
 xmlHttp.open("GET",url,false);
 if (window.navigator.userAgent.indexOf("Firefox")>=1){
 //如果是firefox3.0
 xmlHttp.send("progress_key=<?php echo $unid;?>");
 if(xmlHttp.status==200) doHttpReadyStateChange();
 
 }else{
 xmlHttp.onreadystatechange = doHttpReadyStateChange;
 xmlHttp.send("progress_key=<?php echo $unid;?>");
 }
 }
 //回调函数
 function doHttpReadyStateChange() {
 if (xmlHttp.readyState== 4){
 proNum=parseInt(xmlHttp.responseText);
 //alert(proNum);
 document.getElementByIdx_x("progressinner").style.width = proNum+"%";
 document.getElementByIdx_x("showNum").innerHTML = proNum+"%";
 if ( proNum < 100){
 setTimeout("sendURL()", 200);
 }else{
 //上传成功后,还不能及时得到信息。还希望高人指点
 document.getElementByIdx_x("progressouter").style.display="none";
 document.getElementByIdx_x("progressinner").style.display="none";
 document.getElementByIdx_x("showNum").style.display="none";
 document.getElementByIdx_x("theframe").style.display="none";
 document.getElementByIdx_x("link2").style.display="block";
 }
 
 }
 }
 function startProgress(){
 document.getElementByIdx_x("progressouter").style.display="block";
 setTimeout("sendURL()", 200);
 }
 function newsofturl(text){
 document.getElementByIdx_x("link2").style.display="block";
 document.getElementByIdx_x("link2").value=text;
 }
 </script>
 <iframe id="theframe" name="theframe" src="softupload.php?id=<?php echo($unid); ?>" style="border: 0; height: 80px; width: 400px; " frameborder="0" scrolling="no" > </iframe>
 <input name="linkdefult" type="hidden" id="linkdefult" value="0" />
 <br />
 <div id="link2" style="display:none;" > <font size=2>上传成功!    文件大小为:
 <input type="text" name="filesize" id="filesize" style="width:50px;"/>
 </font><br>
 <br>
 <font size=2>文件下载地址为:</font><br />
 <input type=text name='link' id='link' style='width:380px;' />
 </div>
 <br/>
 <div id="progressouter" style="width: 500px; height: 20px; border: 1px solid #000000; display:none;">
 <div id="progressinner" style="position: relative; height: 20px; background-color: #333333; width: 0%; "></div>
 </div>
 <div id='showNum' style="font-size:12px; color:#333333"></div>
 </div>
</div>

softupload.php

<?php
 $id = $_GET['id'];
?>
<script language="javascript">
//Trim the input text
function Trim(input)
{
 var lre = /^\s*/;
 var rre = /\s*$/;
 input = input.replace(lre, "");
 input = input.replace(rre, "");
 return input;
 }
function CheckForTestFile()
 {
 var file = document.getElementByIdx_x('Softfile');
 var fileName=file.value; 
 //Checking for file browsed or not
 if (Trim(fileName) =='' )
 {
 alert("请为上传选择一个文件!!!");
 file.focus();
 return false;
 }
 //Setting the extension array for diff. type of text files
 var extArray = new Array(".rar", ".zip", ".exe", ".gz"); 
 //getting the file name
 while (fileName.indexOf("\") != -1)
 fileName = fileName.slice(fileName.indexOf("\") + 1);

 //Getting the file extension  
 var ext = fileName.slice(fileName.indexOf(".")).toLowerCase();
 for (var i = 0; i < extArray.length; i++)
 {
 if (extArray[i] == ext)
 {
 window.parent.startProgress(); return true;
 }
 }
 alert("正确的文件格式为" + (extArray.join(" ")) + "\n请选择一个新的 " + "文件提交上传.");
 file.focus();
 return false; 
 } 
</script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<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?>"/>
<table width="322" border="0" cellpadding="0" cellspacing="0" id="linkTable">

 <tr>
 <td >1.选择软件<br />

 <input name="Softfile" type="file" id="Softfile" /></td>
 <td ><br />
 <input name="submit" type="submit" onclick="return CheckForTestFile();" value="上传软件"/></td>
 </tr>
 </table>
</form>

target.php

<script language="javascript">
//将上传后的信息返还给父窗口
function chuanzhi(){
parent.document.getElementByIdx_x('filesize').value=document.getElementByIdx_x('size').value;
parent.document.getElementByIdx_x('link').value=document.getElementByIdx_x('newsoftdir').value;
parent.document.getElementByIdx_x('linkdefult').value=1;
}
</script>
<body onLoad="chuanzhi();">
<?php
//header('Content-Type:text/html;charset=gb2312');
define('SOFTDIR', "./upload/"); //上传后路径
define('HTTPSOFTDIR', "http://www.mysite.com/"); //服务器的路径

//判断上传软件后缀名是否允许
function isSoftExt($extension) {
 $ext = array('exe', 'rar', 'zip','gz');
 return in_array($extension, $ext) ? true : false;
}
if($_SERVER['REQUEST_METHOD']=='POST'){
$errors['0'] = true;
$errors['1'] = '请选择上传的软件图片';
$errors['2'] = '上传软件图片失败';
$errors['3'] = '上传软件图片失败';
$daytime = date('Y-m-d-h-m-s');
$timename=str_replace("-","",$daytime); //取得当天的日期时间


 //检查软件是否是正常上传的
 if(!is_uploaded_file($_FILES['Softfile']['tmp_name'])) {
 echo "<script>alert('非正常上传!');history.back();</script>";
 exit;
 }
 $extension = pathinfo($_FILES['Softfile']['name'], PATHINFO_EXTENSION);
 $filename = $timename."_".$_FILES['Softfile']['name'];
 $tmpsize=$_FILES['Softfile']['size'];
 $msize=round($tmpsize/1048576 , 2) ."M";
 $ksize=round($tmpsize/1024 ,2). "K";
 $filesize =$tmpsize>1048576?$msize:$ksize;
 //检查软件文件格式
 if(!isSoftExt($extension)) {
 echo "<script>alert('上传的软件格式有错误!');history.back();</script>";
 exit;
 } 
 //移动软件
 if(!move_uploaded_file($_FILES['Softfile']['tmp_name'], SOFTDIR. $filename)) {
 echo "<script>alert('移动软件出错!');history.back();</script>";
 exit;
 }else{
 echo "<font size=2>上传成功!    文件大小为:<input type=text id='size' value='$filesize'></font><br>";
 echo "<font size=2>文件下载地址为:</font><input type=text id='newsoftdir' value='".HTTPSOFTDIR.$filename."' style='width=380'>";
 }
}else
echo "请不要直接输入地址!";

?>

getprogress.php

<?php
//上传ajas获取进度页面
session_start();
if(isset($_GET['progress_key'])) {
 $status = apc_fetch('upload_'.$_GET['progress_key']);
 echo ($status['current']/$status['total'])*100;
}
echo 'APC_FILE='.APC_FILE;
?>

本文为大家提供了一个php制作带进度上传文件的思路,可能还有一些欠缺的地方,希望大家进行补充,或者是再结合小编之前整理的文章进行学习,希望对大家的学习有所帮助。

PHP 相关文章推荐
php简单静态页生成过程
Mar 27 PHP
php引用地址改变变量值的问题
Mar 23 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
DEDECMS首页调用图片集里的多张图片
Jun 05 PHP
ThinkPHP路由详解
Jul 27 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
CentOS7编译安装php7.1的教程详解
Apr 18 PHP
php基于 swoole 实现的异步处理任务功能示例
Aug 13 PHP
php如何实现只替换一次或N次
Oct 29 #PHP
php抓取网站图片并保存的实现方法
Oct 29 #PHP
最准确的php截取字符串长度函数
Oct 29 #PHP
php关键字仅替换一次的实现函数
Oct 29 #PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 #PHP
适用于初学者的简易PHP文件上传类
Oct 29 #PHP
php实现网站文件批量压缩下载功能
Oct 28 #PHP
You might like
图形数字验证代码
2006/10/09 PHP
php 移除数组重复元素的一点说明
2008/11/27 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
jQuery 阴影插件代码分享
2012/01/09 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
Python中表示字符串的三种方法
2017/09/06 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
生物制药专业自我鉴定
2014/02/19 职场文书
客服专员岗位职责
2014/02/28 职场文书
汽车维修求职信
2014/06/15 职场文书
学校食堂标语
2014/10/06 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
篮球赛新闻稿
2015/07/17 职场文书