文件上传:进度条完成百分比
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 运行 - 但你不能一直取悦所有人.)以上是关于文件上传:进度条完成百分比的主要内容,如果未能解决你的问题,请参考以下文章