在对这个问题进行了大量的故障排除和调试之后,我发现了我认为是的原因以及更好的解决方法。这有点“哈克”(我是一个业余开发者!),所以我愿意提出任何改善这个问题的建议,尽管它似乎对我有用。
从客户端上传的文件实际上是上传到服务器上的此临时位置: 的/ tmp/systemd-私营随机数 -httpd.service- 随机数的/ tmp/sess_ PHP -session-ID
在客户端上传完成后,UI进度条会达到100%,并且在服务器正在处理这些文件时保持这种状态。
服务器端的处理包括将文件从上面的/ tmp位置移动(复制,然后删除)到相关的blueimp位置。 (假设在blueimp选项中启用了“user_dirs”,默认目的地是:/ var/www/html/server/php/files/php-session-id /)。
此复制过程可能会花费大量时间,特别是在大于2GB或大约2GB的文件上。一旦服务器处理完成,blueimp会触发“fileuploaddone”回调,UI将更新为完成状态。
我的目标是在此时提供一些交互式UI反馈(而不是像其他解决方法一样挂在90%)。我的环境能够上传非常大的文件(10GB +),所以我不认为不接受任何用户对文件处理可能需要几分钟的反馈(用户认为该网站崩溃并关闭浏览器等) )。
我的解决方法:
我遇到的是,当文件上传已经完成了在客户端和服务器的处理开始似乎没有成为一个点的blueimp回调的第一个问题。所以我通过创建一个函数(在main.js中)在data.loaded后匹配数据显示我的自定义“processing div”来解决此问题。总:
$('#fileupload').bind('fileuploadprogressall', function (e, data) { console.log(data);
if (data.loaded == data.total) {
setTimeout(function(){
$("#processwarn").fadeTo(300, 1);
},3000);
}})
我定制的div位于下方的进度条信息是进行刷新(用ajax.load)每隔几秒钟,并计算在当前会话中上传的所有文件的总文件大小另一个PHP页面文件夹(目录总规模似乎并没有提供准确的结果):
// Calculate size of files being processed
$filePath = "/var/www/html/server/php/files/*php-session-id*/";
$total = 0;
$d = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($filePath),
RecursiveIteratorIterator::SELF_FIRST
);
foreach($d as $file){
$total += $file->getSize();
}
// Convert to readable format
if ($total >= 1073741824)
{
$total = number_format($total/1073741824, 2) . ' GB';
}
elseif ($total >= 1048576)
{
$total = number_format($total/1048576, 2) . ' MB';
}
elseif ($total >= 1024)
{
$total = number_format($total/1024, 2) . ' KB';
}
elseif ($total > 1)
{
$total = $total . ' bytes';
}
elseif ($total == 1)
{
$total = $total . ' byte';
}
else
{
$total = '0 bytes';
}
// Display spinner gif and size of file currently being processed
echo "<img src=\"img/spinner.gif\" height=\"20px\" width=\"20px\"> Please wait, processing files: $total";
结果看起来是这样的:
编辑:(后一些更多的工作) - 随着引导进度条补充,而不是:
附加点从测试中发现:
随着分块启用(例如设置为1GB(maxChunkSize :1000000000)),问题几乎消失,因为“复制”处理发生在分块点(本例中每1GB),处理时间显着减少到用户。 当最后的处理发生时,服务器只需“rechunk”/复制剩余的最后1GB。
由于此,我也经历了更快的总体上传时间。事后看来,这对许多人来说可能是更简单/更有效的解决方案。
_The上传process_浏览器发送2gig到Apache,Apache的传递2gig到PHP,您的代码运行做了'move_uploaded_file()以'和移动2演出从一个目录到另一个。上传完成后至少会发生最后一部分 – RiggsFolly
感谢您的回复。上传过程本身非常快,问题在于上传完成后。 “移动文件”操作会立即在命令行中执行。那么上传后实际发生什么情况会导致此延迟? – BSUK