【发布时间】:2015-06-12 11:20:28
【问题描述】:
我正在尝试在上传照片时显示图像,以便用户知道我的网站正在做某事,而不是坐在那里。由于某种原因,我可以让它离线正常工作,但不能在线工作。这是我的代码的相关部分:
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
echo '<div id="progress"><img src="images/ani_hiker.gif"/>
<p align="center">Photos uploading...<br/>slow and steady!</p></div>';
ob_end_flush();
flush();
ob_flush();
foreach ($_FILES['files']['name'] as $i => $name) {
//uploading files junk
}
echo '<script language="javascript">
alert("Photos added successfully!");
window.location.href="index.php?username='.$profile_link.'&select=photos";
</script>';
如前所述,离线工作,而不是在线工作。当我在线尝试时,照片会上传,并且 div 会在上传完成后而不是在上传期间显示,并显示在警报框下方。直到您在警告框中单击“确定”后,div 内的图像才会出现,然后在 div 消失之前闪烁一瞬间,您将被带到另一个页面(如预期的那样)。
我觉得这一定是我的服务器的某种设置,但我不知道是什么。我联系了我的托管公司,我们为我的整个站点禁用了输出缓冲,但这并没有解决问题。我已经恢复了输出缓冲,它的行为和往常一样。
【问题讨论】:
-
禁用输出缓冲会使
ob_函数不执行任何操作... -
我根本看不出它应该如何工作。将 HTTP 文件上传到 PHP 脚本时,您的接收脚本仅在上传本身已经完成完全时才开始——因此不应尝试以这种方式显示上传进度根本工作,而不是“本地”,而不是其他任何地方。如果你想用 PHP 做这样的事情,那么你必须按照Session Upload Progress 章节中的描述来实现它。
-
“至少是这样的想法” – 是的,这是一个完全错误的想法。 PHP 只会启动作为文件上传目标的任何脚本,当上传本身完成时 - 所有 服务器接收到的数据,上传临时文件夹中的临时文件已经创建,等等。 “它写在上传图片的循环之外,最重要的是,写在它上面,所以它应该首先发生”——不,这根本不是它的工作原理。 […]
-
[...] 文件不会在循环内“上传”,它们只是从临时文件夹移动到永久位置;同样,到那时上传本身已经完成。您不能在“之前”输出任何 HTML 代码,无论它是否被缓冲,仅仅是因为您的脚本没有开始在上传位完成。输出 HTML 代码的这部分“写在”应该移动文件的部分之上,并不会改变一般的底层逻辑。