PHP 文件上传进度条实现程序

 

目前我知道的方法有两种,一种是使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用PECL扩展模块 uploadprogress实现(http://pecl.php.net/package/uploadprogress)我这里举两个分别实现的例子供参考,更灵活的应用根据自己需要来修改。

 
APC实现方法:
 
安装APC,参照官方文档安装,可以使用PECL模块安装方法快速简捷,这里不说明
配置php.ini,设置参数 apc.rfc1867=1 ,使APC支持上传进度条功能,在APC源码说明文档里面有说明
代码范例:
 

 代码如下 复制代码
if ($_SERVER['REQUEST_METHOD'] == 'POST') {  //上传请求
    $status = apc_fetch('upload_' . $_POST['APC_UPLOAD_PROGRESS']);
    $status['done'] = 1;
    echo json_encode($status);  //输出给用户端页面里的ajax调用,相关文档请自己寻找
    exit;
} elseif (isset($_GET['progress_key'])) {   //读取上传进度
    $status = apc_fetch('upload_'.$_GET['progress_key']);
    echo json_encode($status);
    exit;
} else {
    //其他代码,比如上传表单等
}

uploadprogress 模块实现方法:
使用PECL模块安装方法安装该模块
php.ini里面设置 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”

代码范例:

 代码如下 复制代码

if($_SERVER['REQUEST_METHOD']=='POST') {
    if (is_uploaded_file($_FILES['upfile']['tmp_name'])) {
        $upload_dir = 'your_path/';
        $ext        = strrchr($_FILES['video']['name'], '.');
        $sessid     = $_POST['UPLOAD_IDENTIFIER'] ;
        $tmpfile    = $upload_dir . $sessid; 
        $sessfile   = $upload_dir . $sessid .$ext;
        if (move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)) {
            //上传成功
        } else {
            //上传失败
    } else {
        //上传错误
       
} elseif (!empty($_GET['sessid'])) {
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Content-Type:text/html;charset=UTF-8");
 
    $unique_id = $_GET['sessid'];
    $uploadvalues = uploadprogress_get_info($unique_id);
 
    if (is_array($uploadvalues)) {
        echo json_encode($uploadvalues);
    } else {
        //读取进度失败,另外处理逻辑
    }
   
} else {
    //显示上传表单
}

整合

现在剩下的只是要把所有内容 hook 到一起。您可以通过 progress.php 页面来完成此操作。

清单 5. 最终的 progress.php 页面
               

 代码如下 复制代码

<?php
   $id = uniqid("");
?>
<html>
<head><title>Upload Example</title></head>
<body>

<script src="http://maps.google.com/maps?file=api&v=2&key=<yourkeyhere>"
            type="text/javascript"></script>

<script type="text/javascript">

function getProgress(){
  GDownloadUrl("getprogress.php?progress_key=<?php echo($id)?>",
               function(percent, responseCode) {
                   document.getElementById("progressinner").style.width = percent+"%";
                   if (percent < 100){
                        setTimeout("getProgress()", 100);
                   }
               });

}

function startProgress(){
    document.getElementById("progressouter").style.display="block";
    setTimeout("getProgress()", 1000);
}

</script>

<iframe id="theframe" name="theframe"
        src="upload.php?id=<?php echo($id) ?>"
        style="border: none; height: 100px; width: 400px;" >
</iframe>
<br/><br/>

<div id="progressouter" style=
   "width: 500px; height: 20px; border: 6px solid red; display:none;">
   <div id="progressinner" style=
       "position: relative; height: 20px; background-color: purple; width: 0%; ">
   </div>
</div>

</body>
</html>

 

从底层开始向上层工作,我们已经添加了嵌入清单 1 中的 upload.php 脚本的 iframe,给它提供了在页面顶部生成的惟一 ID。

现在,是否还记得该表单中的 Submit 按钮?

 代码如下 复制代码
<input onclick="window.parent.startProgress(); return true;"
 type="submit" value="Upload!"/>

 

该按钮将完成两项工作。提交表单,像普通的 Submit 按钮一样;但在执行该操作之前,它将在主窗口中调用 startProgress() 脚本。startProgress() 脚本将告诉进度条显示自身 —— 开始时无显示属性,然后告诉浏览器等待一秒,然后再执行 getProgress() 脚本。

现在,getProgress() 脚本将使事情变得有趣。记不记得在前面我说过将需要使用 Ajax 或某种类似的方法来检查文件的进度?对,在本例中,表单将采用捷径,调用来自 Google Maps API 库的 GdownloadUrl() 函数(注意,表单将导入位于页面顶部的库。您将需要获得自己的访问此库的密钥,但是它是从 Google 免费获取的)。

此函数将下载 URL 的内容 —— 本例中为 getprogress.php 脚本 —— 并执行在其中定义的匿名函数。函数所接受的第一个参数是从 URL 返回的数据,本例中为百分比,以便使用它更新进度条。最后,如果文件尚未完成下载,则告诉浏览器每十分之一秒重试一次(在实际情况中,可能无法那么快地执行这些调用,但是浏览器将尽其所能进行操作)。

最终结果是页面使用户可以查看文件正被上传的进度。

如果文件太大了我们可以如下操作:

PHP限制上传文件大小第一:

在php.ini里面查看如下行:

upload_max_filesize = 8M

post_max_size = 10M

memory_limit = 20M

把这些值改成我所说的,看看有没有问题,另外要确认上传的 <form> 里没有类似下面的这行

<input type="hidden" name="MAX_FILE_SIZE" value="500000">这样也是限制上传大小用的。

PHP限制上传文件大小第二:

如果是apache 2 需要修改

/etc/httpd/conf.d/php.conf

中的LimitRequestBody 524288将524288(=512×1024)改大,比如5M(=5×1024×1024)

在PHP限制上传文件大小之后,文件上传就不会出现如上问题,上传不响应,上传现实该页无法现实也将得到解决!

 

时间: 2024-10-02 05:10:11

PHP 文件上传进度条实现程序的相关文章

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

本文实例讲述了PHP利用APC模块实现文件上传进度条的方法.分享给大家供大家参考.具体分析如下: 以前的php5.2之前的版本是不能可使用APC模块的,因为之前的压根就没有这个APC模块,如果想使用APC模块实现上传进度条我们必须是php5.2或更高版本. 从5.2开始APC加入了一个叫APC_UPLOAD_PROGRESS的东东,解决了困扰大家已久的进度条问题.并且它把原来的上传时把临时文件全部缓存到内存改成了当临时文件达到设定值时就自动保存到硬盘,有效地改善了内存利用状况. 它的作用原理是在

PHP中使用Session配合Javascript实现文件上传进度条功能_php技巧

Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足

asp.net 文件上传进度条实现代码

asp教程.net 文件上传进度条实现代码 index.htm就是文件上传页面,提交form给uploadhandler目录下的default.aspx,以实现文件上传. progresshandler目录下三个文件为abort.ashx.genericguid.ashx,handler.ashx功能分别为:根据guid取消正在上传的文件,生成guid,根据guid获取上传信息. 第一步:建立index.htm页面,这个上传页面,需要注意的就是需要一个隐藏的iframe,并且名字为form提交的

PHP文件上传进度条基于Session与Javascript实现

下面我们就详细介绍一下 PHP 5.4 的这个 session.upload_progress 新特性. 原理介绍 当浏览器向服务器端上传一个文件时,PHP将会把此次文件上传的详细信息(如上传时间.上传进度等)存储在session当中.然后,随着上传的进行,周期性的更新session中的信息.这样,浏览器端就可以使用Ajax周期性的请求一个服务器端脚本,由该脚本返回session中的进度信息:浏览器端的Javascript即可根据这些信息显示/更新进度条了. 那么,文件上传信息具体是如何存储的?

服务器-我这样做asp.net异步文件上传进度条

问题描述 我这样做asp.net异步文件上传进度条 前台两个请求 1.上传文件的请求 2.获取上传进度的请求 1. $("#ufrm").ajaxSubmit({ url: "ReceivFile.ashx", type: "post", success: function (data) { ... 2. $.ajax({ type: "post", url: "Filepro.aspx", data: {

HTML5 Ajax文件上传进度条如何显示_AJAX相关

原本打算使用jquery插件进行异步文件上传,比如uploadfy但是需要额外的支持,也有人用iframe模仿异步上传机制,感觉都比较别扭.因为项目不考虑低版本浏览器,所以决定用html5实现.下面只是一个简单的demo,具体样式需要自己去做. 后台基于strut2进行文件处理,具体因项目而定.只是要注意设置文件大小的限制.  <constant name="struts.multipart.maxSize" value="52428800"/>这个配置

php ajax实现文件上传进度条_php技巧

本实例是关于php文件上传时进度条的实现,主要采用ajax技术,另外还运用了html5,有需要的朋友可以研究一下. 本实例有两个文件: upload_form.html: <!DOCTYPE html> <html> <head> <script> function _(el){ return document.getElementById(el); } function uploadFile(){ var file = _("file1"

PHP Session和Javascript实现文件上传进度条

在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足在于,它需要安装PHP的APC扩展库,要求用户能够控制服务器端的配置.另外,如果安装APC仅仅是为了实现一个上传进度条,那么显然有点杀鸡用牛刀的意思. 第三

文件上传进度条php代码

目前我知道的方法有两种,一种是使用php的创始人 rasmus lerdorf 写的apc扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用pecl扩展模块uploadprogress实现(http://pecl.php.net/package/uploadprogress) 我这里举两个分别实现的例子供参考,更灵活的应用根据自己需要来修改. apc实现方法: 安装apc,参照官方文档安装,可以使用pecl模块安装方法快速简捷,这里不说明 配置p