2007
08.27

  目前我知道的方法有两种,一种是使用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 {
        
    //显示上传表单
    }

11 comments so far

Add Your Comment
  1. chicago museum of science and industry illinois…

    chicago museum of science and industry illinois…

  2. [...] 作者:Michael,来源:http://www.toplee.com/blog/463.html [...]

  3. Customized Design Solutions…

    I couldn’t understand some parts of this article, but it sounds interesting…

  4. 有支持断点的模块的吗?

  5. jason on September 19, 2008 at 11:36 am  (Quote) said:

    有支持断点的模块的吗?

    断点续传这事儿,需要客户端来支持,仅靠服务器端,服务做到。

  6. 在JSP中,文件上传进度条如何实现?

  7. Fisher on October 8, 2008 at 1:42 pm  (Quote) said:

    在JSP中,文件上传进度条如何实现?

    还真不知道,原来折腾tomcat和resin的时候,没有研究过这个,我想应该有这方面的开源组件的,baidu或者google试试吧。

  8. kakashilw on March 22, 2009 at 8:09 pm  (Quote) said:

    hi…请问你的blog的代码高亮用的是哪个插件啊???

    coolcode 好像作者网站是 http://www.coolcode.cn ,是个牛人。

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word