我需要使用PHP和HTML表单将文件上传到服务器。
我使用了w3school的例子:PHP 5 File Upload这对我非常有帮助并帮助了我很多。
当然我需要调整代码才能解决我的问题,所以情况就是这样:
1) HTML表单放入 fileform.php :
<!-- fileform.php -->
<form action="upload.php" method="post" enctype="multipart/form-data">
<h3>Upload a file:</h3>
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload" name="submit">
</form>
2)这是我的 upload.php :
<?php
/* upload.php */
set_time_limit(0);
$targetDir = "/path/to/upload/dir";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
$upload = 1;
$fileType = pathinfo($targetFile, PATHINFO_EXTENSION);
if(isset($_POST["submit"]))
{
/* Check file size */
if($_FILES["fileToUpload"]["size"] > 50000000000)
{
echo "Sorry, your file is too large.";
$upload = 0;
ob_end_flush();
include("fileform.php");
}
/* Allow certain file formats */
if($fileType != "data" )
{
echo "Sorry, non valid filetype.";
$upload = 0;
ob_end_flush();
include("fileform.php");
}
/* Check if $uploadOk is set to 0 by an error */
if($upload == 0)
{
echo "Sorry, your file was not uploaded.";
ob_end_flush();
include("fileform.php");
}
else
{
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile))
{
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
}
else
{
echo "Sorry, there was an error uploading your file.";
}
ob_end_flush();
include("fileform.php");
}
}
我可以正确上传文件,但我无法正确重新加载PHP页面。 它只显示一个带有白色背景的页面:
文件file.data已上传。
警告:session_start()[function.session-start]:无法发送会话缓存限制器 - 已在/ var / www / login中发送的标头(输出从/var/www/upload.php:40开始)第4行的.php
带有PHP页面的一些图标......
我很安静,确定我在 upload.php 文件中做错了什么,但我不知道到底出了什么问题,以及如何修复它。
为了正确重新加载PHP页面,我如何更改代码?
提前感谢您的帮助。
答案 0 :(得分:1)
“已发送标头”表示您的PHP脚本已经发送了HTTP标头,因此它现在无法对它们进行修改。
在致电session_start
之前,请检查您是否发送了任何内容。更好的是,只需要在PHP文件中首先执行session_start
(所以在所有HTML等之前将它放在绝对的开头)。
在<?php
ob_start();
你可以这样使用:
<?php
ob_start();
session_start();
include 'your php file';
...
...
答案 1 :(得分:0)
PHP是服务器端语言,因此您应该使用javascript重新加载页面。
<script>
function myFunction() {
location.reload();
}
</script>
这将重新加载当前页面。
答案 2 :(得分:0)
如果要在服务器端刷新页面: 在普通的php中,您可以使用标题函数(http://php.net/manual/ru/function.header.php)来刷新当前页面。
header('Location: /'.$_SERVER["REQUEST_URI"]);
如果您想在客户端刷新页面,可以使用:
location.reload()
(JavaScript的)
答案 3 :(得分:0)
只显示带有白色背景的页面:文件file.data已上传。
这是你的代码:
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile))
{
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
}
else
{
echo "Sorry, there was an error uploading your file.";
}
ob_end_flush();
include("fileform.php");
您之后遇到错误的原因是您必须在ob_end_flush()之后的某个地方调用session_start() - 但这不会出现在您向我们展示的任何代码中。即您向我们展示的代码不会产生您引用的错误。
巧合的是,尽管上面的代码充满了ob_end_flush()(没有明显的原因),但没有ob_start()。这可能会出现在您未向我们展示的代码中。
答案 4 :(得分:0)
我在upload.php文件中做错了什么,但我不知道到底出了什么问题
您遇到的问题是经典问题。
在您的fileform.php
脚本中,您正在呼叫session_start()
(通过login.php
)。这在文件上传后不起作用,因为在上传脚本中您已通过echo
写入HTTP响应正文:
session_start()
需要编写HTTP标头。由于标题已经发送session_start()
无法完成其工作。
这是错误消息试图说的内容:
警告:session_start()[function.session-start]:无法发送会话缓存限制器 - 已在/ var / www / login中发送的标头(输出从/var/www/upload.php:40开始)第4行的.php
-
如何修复
在将任何其他内容发送到回复正文之前,您需要重构上传脚本以便include('fileform.php')
。
<?php
// .. do not echo anything
include('fileform.php');
// .. do the file upload stuff.
注意:如果您尝试在echo
之后重定向,则会遇到与session_start()
相同的问题,因为HTTP重定向需要编写响应标头。
答案 5 :(得分:0)
您可以通过重定向到相同的网址重新加载同一页面。
<?php
redirect(your_url);
?>