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

igetnqfo  于 2023-03-11  发布在  Java
关注(0)|答案(5)|浏览(436)

我尝试在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处理。
如何创建“完成百分比”进度条并在文件上传时显示?

lyfkaqu1

lyfkaqu11#

我不熟悉BuddyPress,但是所有的上传处理程序(包括androbin概述的HTML5 XHR)都有一个可以绑定的文件进度钩子点。
我已经使用了uploadifyuploadifiveswfupload,它们都可以与相同的进度函数处理程序交互,以获得相同的进度条结果。

// 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上传程序使用。
至于实际的进度条代码..
超文本:

<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>

联森:

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

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

0mkxixxg2#

你应该使用一个XHR对象。我不知道它是否对你有帮助,但我写了一个简单的XHR上传程序。
超文本:

<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>

联森:

$("#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”,然后发出错误警报。

fhg3lkii

fhg3lkii3#

我认为,在您担心客户端的事情之前,您应该了解服务器端的需求,以便能够真正实现这一点。
对于PHP,您需要启用**session.upload_progress**,除非wp_handle_upload()函数使用了不同的东西,所以我在这里只是猜测,但很有可能他们确实使用了常规的PHP会话内容,因此需要启用它。
如果你看了给出的链接的评论,很多用户说进度状态在某些环境下不起作用,比如FastCGI上的PHP,这是你在共享主机环境中大部分时间会得到的结果。
现在很多人都告诉你使用XHR上传程序,但问题是,他们给你一个自定义upload.php脚本或类似的东西发送数据的例子,但你正在使用一个WordPress插件,你不控制(有点)
因此考虑到wp_handle_upload()实际上并不以 AJAX 方式工作,那么您必须在单击文件上传表单提交按钮时挂钩一个事件,并在JS中设置一个计时器,该计时器调用您传递表单数据(如ID)的某个URL,然后使用该ID查询会话以检查文件的进度:

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

有了这些数据,你就可以计算出已经传输了多少,你可以设置JS计时器每秒调用一次,但是如果上传的文件不是很大(比如大于1mb),并且连接良好,那么就不会有太多的进度需要通知。
查看this link,了解如何使用此会话上载数据的分步示例。

jaql4c8m

jaql4c8m4#

您需要插入进度条。
我认为唯一的方法是使用过滤器钩子apply_filters('bp_core_pre_avatar_handle_upload'等)覆盖函数bp_core_avatar_handle_upload。
你最终会复制大部分的功能,但是你应该能够添加你的进度条代码。
如果你得到这个工作,你应该提交它作为一个增强票;这是个好主意。

fcipmucu

fcipmucu5#

你可以看到这个网址为XHR的例子。
访视x1月0n1x

<h2>HTML5 File Upload Progress Bar Tutorial</h2>
<form id="upload_form" enctype="multipart/form-data" method="post">
  <input type="file" name="file1" id="file1" onchange="uploadFile()"><br>
  <progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
  <h3 id="status"></h3>
  <p id="loaded_n_total"></p>
</form>

function _(el) {
  return document.getElementById(el);
}

function uploadFile() {
  var file = _("file1").files[0];
  // alert(file.name+" | "+file.size+" | "+file.type);
  var formdata = new FormData();
  formdata.append("file1", file);
  var ajax = new XMLHttpRequest();
  ajax.upload.addEventListener("progress", progressHandler, false);
  ajax.addEventListener("load", completeHandler, false);
  ajax.addEventListener("error", errorHandler, false);
  ajax.addEventListener("abort", abortHandler, false);
  ajax.open("POST", "file_upload_parser.php"); // http://www.developphp.com/video/JavaScript/File-Upload-Progress-Bar-Meter-Tutorial-Ajax-PHP
  //use file_upload_parser.php from above url
  ajax.send(formdata);
}

function progressHandler(event) {
  _("loaded_n_total").innerHTML = "Uploaded " + event.loaded + " bytes of " + event.total;
  var percent = (event.loaded / event.total) * 100;
  _("progressBar").value = Math.round(percent);
  _("status").innerHTML = Math.round(percent) + "% uploaded... please wait";
}

function completeHandler(event) {
  _("status").innerHTML = event.target.responseText;
  _("progressBar").value = 0; //wil clear progress bar after successful upload
}

function errorHandler(event) {
  _("status").innerHTML = "Upload Failed";
}

function abortHandler(event) {
  _("status").innerHTML = "Upload Aborted";
}

相关问题