文件上传:进度条完成百分比

Posted

技术标签:

【中文标题】文件上传:进度条完成百分比【英文标题】:File uploads: Percentage completed progress bar 【发布时间】:2014-03-05 23:30:00 【问题描述】:

我正在尝试为BuddyPress 中的头像上传添加一个“到目前为止完成的百分比”进度条。目的是阻止用户在上传完成之前离开页面。

上传过程在 BuddyPress 中由 bp-core/bp-core-avatars.php 文件中的 bp_core_avatar_handle_upload() 处理。该函数首先使用bp_core_check_avatar_upload() 检查文件是否已正确上传。然后它会检查文件大小是否在限制范围内,以及它是否具有可接受的文件扩展名(jpg、gif、png)。如果一切顺利,则允许用户裁剪图像(使用Jcrop),然后将图像移动到其真实位置。

实际上传由WordPress函数wp_handle_upload处理。

如何创建“完成百分比”进度条并在文件上传时显示?

【问题讨论】:

【参考方案1】:

我不熟悉 BuddyPress,但所有上传处理程序(包括 android 概述的 html5 XHR 处理程序)都有一个可以绑定到的文件进度挂钩点。

我使用过uploadify、uploadifive 和swfupload,它们都可以与相同的进度函数处理程序进行交互,以获得相同的进度条结果。

// SWFUpload
$elem.bind('uploadProgress', function(event, file, bytesLoaded)  fnProgress(file, bytesLoaded); )

// Uploadify
$elem.uploadify( onUploadProgress: function (file, bytesUploaded, bytesTotal, totalBytesUploaded, totalBytesTotal)  fnProgress(file, bytesUploaded); );

// Uploadfive
$elem.uploadifive( onProgress: function(file, e)  fn.onProgress(file, e.loaded); );

Uploadifive 是一个基于 HTML5 的上传器,只需绑定到 XHR 'progress' 事件,因此所有这些属性都可用于任何 HTML5 上传器。

至于实际的进度条码..

HTML:

<div class='progressWrapper' style='float: left; width: 100%'>
    <div class='progress' style='float: left; width: 0%; color: red'></div>
    <div class='progressText' style='float: left;></div>
</div>

JS:

var fnProgress = function(file, bytes) 
    var percentage = (bytesLoaded / file.size) * 100;

    // Update DOM
    $('.progress').css( 'width': percentage + '%' );
    $('.progressText').html(Math.round(percentage + "%");

【讨论】:

【参考方案2】:

您应该使用 XHR 对象。如果它对你有帮助,我现在不知道,但我写了一个简单的 XHR 上传器。

HTML:

    <form id="uploader" enctype="multipart/form-data" action="uploadimage.php" method="post">
        <input type="file" id="file" name="file[]" multiple="multiple" accept="image/jpeg" /><br/>
        <input type="submit" value="Upload" />
        <div class="list" style="background-color:#000;color:#FFF;padding:5px;display:none;border-radius:5px;">
        </div>
    </form>

JS:

$("#uploader").submit(function()
    $('#uploader .list').fadeIn(100).css("width","0px");
    var data = new FormData();
    // if you want to append any other data: data.append("ID","");
    $.each($('#file')[0].files, function(i, file) 
        data.append('file-'+i, file);
    );
    $.ajax(
        url: 'uploadimage.php',
        data: data,
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        xhr: function()   // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload) // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            
            return myXhr;
        ,
        success: function(data2)
            $('#uploader .list').css(
                "width":"200px",
                "text-align":"center",
                "margin":"10px 0 10px 0"
            ).html("DONE!").delay(2000).fadeOut(500);
            if (data2 == "ERROR_FILESIZE")
                return alert("Choose another file");
            
                            else /*change location*/ 
        );
    return false;
);

在这种情况下,我使用uploadimage.php 上传了文件,如果它打印:“ERROR_FILESIZE”,那么它会提示错误。

【讨论】:

【参考方案3】:

我认为,在您担心客户端的事情之前,您应该了解服务器端的要求才能真正做到这一点。

对于 PHP,您需要启用 session.upload_progress,除非 wp_handle_upload() 函数使用不同的东西,所以我在这里只是猜测,但他们可能确实使用常规 PHP 会话的东西因此需要启用它。

如果您查看给定链接的 cmets,许多用户表示进度状态在某些环境下不起作用,例如 FastCGI 上的 PHP,这是您在大多数时间在共享托管环境中会得到的。

现在这里很多人告诉你使用 XHR 上传器,但问题是他们给你一个自定义 upload.php 脚本的例子或类似的东西来发送数据,但你使用的是一个 wordpress 插件你无法控制(有点)

因此,考虑到 wp_handle_upload() 实际上并不能以 AJAX 方式工作,那么您必须在单击文件上传表单提交按钮时挂钩一个事件,并在 JS 中设置一个计时器,该计时器调用您传递表单的某个 URL ID 之类的数据,然后使用该 ID 查询会话以检查文件的进度:

 $_SESSION["upload_id"]["content_length"]
 $_SESSION["upload_id"]["bytes_processed"]

使用该数据,您可以计算已转移了多少。您可以将 JS 计时器设置为每秒调用一次,但如果它们上传的文件不是很大(例如,大于 1mb)并且它们具有良好的连接,那么将不会通知太多进度。

查看this link,了解如何使用此会话上传数据的分步示例。

【讨论】:

【参考方案4】:

您需要注入进度条。

我认为唯一的方法是使用过滤器挂钩 apply_filters( 'bp_core_pre_avatar_handle_upload' 等) 覆盖函数 bp_core_avatar_handle_upload

您最终会复制大部分功能,但您应该能够添加进度条代码。

如果你得到这个工作,你应该把它作为增强票提交;这是个好主意。

【讨论】:

嗨,shanebp - 我正在考虑按照这些思路做点什么。然而,正是代码生成了一个让我苦苦挣扎的进度条。我已经编辑了我的问题。有什么想法可以做到吗?我正在为此苦苦挣扎:( 呵呵未拍!我实际上并没有 - 试图自己做 - 但现在看到有可用的脚本!有什么建议吗? johnboy.com/php-upload-progress-bar 看起来很简单 我注意到,对于大多数 PHP 解决方案,您必须在服务器上安装 APC - 我不能保证在我安装它的每个站点上都有。 不再是这种情况了,请参阅php.net/manual/en/session.upload-progress.php (尽管这又需要 PHP not 通过 FastCGI 运行 - 但你不能一直取悦所有人.)

以上是关于文件上传:进度条完成百分比的主要内容,如果未能解决你的问题,请参考以下文章

前端上传文件实时显示进度条和上传速度的工作原理是怎样的?

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

使用 jQuery 的文件上传进度条

使用 jQuery 的文件上传进度条

java上传实现百分比的进度条,怎么实现

如何在spring mvc 里加入监听器,来监听文件上传进度条