【问题标题】:Creating a custom upload progress bar创建自定义上传进度条
【发布时间】:2010-06-18 07:17:27
【问题描述】:

我见过所有的上传进度条插件、小部件等——它们都很糟糕。它们要么太笨重,包含太多无用的代码,要么无法正常工作。

我想知道在哪里可以阅读有关如何显示简单上传进度指示器的信息。大多数浏览器在下方都有一个状态进度条,但在与客户打交道时仅使用它不是很专业。

浏览器是如何做到的?我想知道浏览器如何工作以指示上传状态的内部原理,以便我可以使用 PHP 和 jquery 制作一些东西。

谢谢。

【问题讨论】:

  • 确实他们都这样做了,因为浏览器提供给网页的信息量是(有意的)有限的。浏览器进度条的工作级别低于页面内的进度条,因此它有更多关于页面状态的数据,因此它的 Sucks Less (TM)。如果您想构建自己的、更好的页内进度条,那就去吧。
  • 而且恕我直言,浏览器栏也很糟糕 - AFAIK 只有 Chrome 和 Opera 会显示在执行 POST 请求时上传了多少数据。

标签: php jquery upload


【解决方案1】:

由于您想使用 PHP,我将从 uploadprogress extension 开始(默认情况下,在上传完成之前,PHP 不会为您提供任何数据;此扩展程序提供此类服务器端功能)。请注意,它需要 PHP 5.2+,并且可能对配置选项很挑剔。另见其commentary and demotroubleshooting hints)。 PHP 文档comments 中提供了一个简短的概述。

使用扩展程序,您可以获得一些上传统计信息;然后您可以通过 AJAX 轮询服务器并更新某种进度条。

更具体一点:

  • 获取表单的唯一标识符,并将其包含在隐藏字段中
  • 上传应该在 IFRAME 中运行 - 某些浏览器不允许 DOM 更新到运行上传的同一页面
  • 通过 AJAX 轮询服务器(使用标识符指定您感兴趣的上传内容)并解析结果(IIRC,您会得到类似“bytes_uploaded => 123, content-length=> 1000”)
  • 更新您的进度条(显示方式由您决定,我使用“x% done”加上图形栏)
  • 表单上传成功后重定向整个页面

(哦,顺便说一句,检查 PHP 的 upload_max_filesize 和 post_max_size 设置,因为它们都限制了最大上传大小)

【讨论】:

    【解决方案2】:

    没有可靠的方法来获取使用 JavaScript 上传文件的进度。许多浏览器都缺少对XMLHttpRequest upload.onprogress 事件的支持,即使是HTML5,您也不可避免地需要转向Flash,或者其他文件上传方法。

    在询问了this question 之后,我最终决定使用plupload 来满足我的上传需求。

    【讨论】:

    • 确实,使用only JS时没有可靠的方法;如果你可以问服务器“我们到了吗?”,事情就变得容易了。
    【解决方案3】:

    Javascript/Ecmascript 不能与本机浏览器功能混淆(主要使用 C/C++ 以及访问 TCP/UDP 套接字的 OS APIs

    要显示带有JS 的进度条,您需要服务器反馈。这可以通过使用服务器polling 来实现,例如COMET。 但在这一点上,它从来没有像浏览器内置进度条那样准确。它可能会随着HTML5 WebSockets 而改变。

    要获得准确的结果,您需要持续的连接。您可以fakegild 客户端-服务器请求延迟,但它仍然存在。我不确切知道Flash 是如何处理这个问题的,但我想它也没有面向连接的流(如果我在这里错了,请纠正我)。

    【讨论】:

    • Flash 知道它已经传输了多少字节/需要多少字节,并在连接打开和传输时触发事件。这是 xhr.upload.onprogress 事件(在 Firefox 3.5 中松散支持)应该提供的东西,但我从来没有让它可靠地工作。
    【解决方案4】:

    我知道这不是您要找的东西,但我最近一直在使用 plupload 进行上传,而且看起来不错,而且不完全依赖 flash 或 html5

    示例:


    • url 是处理页面(php 文件)
    • container = 上传按钮所在的父 div 或表单(设置它非常重要 - 有一些示例说明如何将内容附加到 plupload 所做的某些操作。例如,您可以在下面看到我有将uploader.start();附加到uploader.start(); 钩子上。
    • 您还应该能够通过附加到上传进度挂钩来查看我是如何制作自定义上传进度条的

    如果遇到困难,值得在 plupload 网站的论坛上提问,他们很擅长回答问题!

    $(function(){
        //plupload
        var uploader = new plupload.Uploader({
            runtimes : 'gears,html5,flash',
            browse_button : 'pickfiles',
            container : 'form_2',
            max_file_size : '10mb',
            url : '<?php echo SITE_ROOT ?>plupload/upload.php',
            //resize : {width : 320, height : 240, quality : 90},
            flash_swf_url : '<?php echo SITE_ROOT ?>plupload/js/plupload.flash.swf',
            filters : [
                {title : "Image files", extensions : "jpg,gif,png"}
            ]
        });
    
    
    uploader.init();
    
    uploader.bind('FilesAdded', function(up, files) {
        uploader.start();
    });
    
    uploader.bind('UploadProgress', function(up, file) {
        if(file.percent < 100 && file.percent >= 1){
            $('#progress_bar div').css('width', file.percent+'%');
        }
        else{
            $('#progress_bar').fadeOut(600);
        }                               
    });                         
    

    【讨论】:

    • 谢谢我喜欢 plupload 看起来真的很酷。但是你是如何让它与要上传的 php 页面链接的呢?我似乎无法弄清楚。
    • 我已经用我用来调用 plupload 的脚本更新了我的答案。
    • 除了 plupload 不能在没有 flash 的 msie 上工作?!-(
    猜你喜欢
    • 2019-03-11
    • 2013-07-09
    • 1970-01-01
    • 2020-11-29
    • 2021-04-08
    • 2015-10-30
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多