我遇到了一些我已经设置的php上传器的问题,而且/一旦php脚本完成,我的页脚就完全消失了。
这是我的php代码:
<div class="container" id="main">
<span class="text-image2 img-responsive"> 0-60 Challenge <i class="fa-stop icon-3x" id="square"></i></span>
<!--CONTENT-->
<div class="content">
<h1>Title</h1>
<form action="" id="Uploader" method="post" enctype="multipart/form-data">
Select image to upload:
<br> Name:
<input type="text" id="vistorname" name="vistorname">
<br>
Email:
<input type="text" id="emailaddress" name="emailaddress">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Video" name="submit">
</form>
<div id="progress" style="width:500px;height: 24px;border:1px solid #ccc;"></div>
<!-- Progress information -->
<div id="information" style="width"></div>
<div id="files" class="files">
<h3>Uploaded files will appear below</h3>
<?php
if (isset($_POST['submit']))
{
echo
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
// Check if file already exists
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// Check file size -- Kept for 500Mb
if ($_FILES["fileToUpload"]["size"] > 500000000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "wmv" && $imageFileType != "mp4" && $imageFileType != "avi" && $imageFileType != "MP4" && $imageFileType != "jpg") {
echo "Sorry, only wmv, mp4 & avi files are allowed.";
$uploadOk = 0;
}
// Total processes
$total = 10;
// Loop through process
for($i=1; $i<=$total; $i++){
// Calculate the percentation
$percent = intval($i/$total * 100)."%";
// Javascript for updating the progress bar and information
echo '<script language="javascript">
document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#FF0000;\"> </div>";
document.getElementById("information").innerHTML="'.$i.' row(s) processed.";
</script>';
// This is for the buffer achieve the minimum size in order to flush data
echo str_repeat(' ',1024*64);
// Send output to browser immediately
flush();
// Sleep one second so we can see the delay
sleep(1);
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
echo '<script language="javascript">document.getElementById("information").innerHTML="Process completed"</script>';
$name = $_POST['vistorname'];
$email_address = $_POST['emailaddress'];
// create email body and send it
$to = '[add email]';
$email_subject = "Crazy Way New 0-60 Video: $name";
$email_body = "You have received a new message. Here are the details:\n\n".
" \nName: $name \n Email: $email_address\n ".
"File: ". basename( $_FILES["fileToUpload"]["name"]). ".";
$headers = "From: [add email]\n";
$headers .= "Reply-To: $email_address";
mail($to,$email_subject,$email_body,$headers);
return true;
} else {
echo "Sorry, there was an error uploading your file. Please note that we only accept wmv, mp4 & avi files.";
}
}
}
?>
</div>
<p align="center">Please contact us if you are having issues uploading your video. </p></div>
<!--END Content-->
<!-- FOOTER -->
<?php include('includes/footer.php'); ?>
<!-- END FOOTER -->
</div>
谁能告诉我我做错了什么?
P.S。我目前允许JPG文件在测试时获得速度。
答案 0 :(得分:2)
您遇到的问题归结为sleep()
功能所在的位置。
sleep()延迟程序执行达到给定的秒数。
你需要记住PHP的工作原理是从顶部开始 - &gt;下。在你的情况下,这就是PHP正在做的事情:
首次加载页面时:
顶部HTML一直加载到<div id="files"><h3>Uploaded files will appear below</h3>
然后遇到第一个<?php
所以它现在读取PHP代码
由于未设置$_POST
,您的if (isset($_POST['submit']))
会失败并转到结束else
所在的?>
最后它运行剩余的HTML,包括footer.php
点击&#34;上传视频&#34;您正在提交form
。提交form
后会查看其action
属性,如果它有类似test.php
的内容,那么它会重定向到该页面,在您的情况下它是空白的,因此它会刷新您的页面发送POST请求。现在您的页面以这种方式加载:
顶部HTML一直加载到<div id="files"><h3>Uploaded files will appear below</h3>
遇到第一个<?php
所以它现在读取PHP代码
由于$_POST
现已设定,您的if (isset($_POST['submit']))
成功
设置目标目录/文件,如果上传的文件与您的条件不符,则设置错误
然后执行一次持续10秒的迭代。此迭代使用sleep()
,这意味着您的页面的所有解析都会暂停,直到该点为止。 这样让你的页脚消失了#34;在运行脚本时暂时。
最后它运行剩余的HTML,包括footer.php
正如您所看到的,在您的sleep
到位后,您的代码将停止运行。要解决此问题,您需要重新构建代码,甚至更好地使用AJAX
。
答案 1 :(得分:0)
从脚本中删除return true;
。
Return具有特定含义:
return将程序控制返回给调用模块。执行 在被调用模块的调用之后的语句处继续。
在您的情况下,没有调用模块,因此只要成功发送邮件,脚本就会结束。
一个简单的例子:
<p> foo bar <p>
<?php
return true;
?>
<p> more stuff </p>
输出:
<p> foo bar <p>
答案 2 :(得分:0)
您正在使用include
部分来实现错误的目标。在PHP解释器到达其<?php
起始标记之前,它不会将文件自我输出附加到它所声明的位置,并且在上传功能完成之前它不会到达它。这就是你面临延迟的原因。
严格回答您的问题,而不是指出更好的做法(因为它不是问题范围),您必须将整个代码包装在单个<?php ?>
PHP匹配标记对中。因此,请考虑echo
此
</div>
<p align="center">Please contact us if you are having issues uploading your video. </p>
而不是直接在HTML中编写它。这样,PHP解释器就会将代码解析为一件事,你不应该再面对这个问题了。
[编辑] 另外,请考虑@ HPierce的回复并从代码中删除return true;
,避免突然发动机中断。