php - 使用isset($ _ FILE)但它总是返回true?

时间:2014-02-20 05:42:38

标签: php forms

我想知道每次刷新页面时我都要以某种方式清除$ _FILES,或者为什么它回显给我变量设置而且也不是空的?当我第一次加载,或重新加载页面显然至少是使用print_r

<html>   
<form action="" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>   
</html>

<?php 


if(isset($_FILES["file"]) && !empty($_FILES["file"])){
  echo 'You have just uploaded '. $_FILES["file"]["name"];

}
?>

4 个答案:

答案 0 :(得分:1)

检查表单是否已发布,否则您的代码在页面加载时

<?php 

if($_POST['submit']=="submit"){
if(isset($_FILES["file"]) && !empty($_FILES["file"])){
  echo 'You have just uploaded '. $_FILES["file"]["name"];

}
}
?>

答案 1 :(得分:1)

实际上,您正面临着这样的问题,因为在您通过选择文件提交后,浏览器会缓存页面响应&amp;当您按F5right click->reload刷新它时,它只返回缓存的结果。您可以通过虚拟GET请求重新加载它来尝试旧代码,它可以正常工作。例如 : 如果此页面的网址为:http://localhost/file.php,请在地址栏中键入:http://localhost/file.php/?dummy=abc,然后您会发现您的代码正常运行...因此,您必须验证的不只是$ _FILES而是$ _FILES [ “文件”] [“名称”]相反,会很好......

试试这个,你不会有任何麻烦......

    <html>


<form action="" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>


</html>

<?php 


if(isset($_FILES["file"]) && !empty($_FILES["file"]["name"])){
  echo 'You have just uploaded '. $_FILES["file"]["name"];

}
?>

答案 2 :(得分:0)

action=""表示您将数据发布到当前页面,但在发布数据后,当您刷新页面时,浏览器会询问您是否重新发布数据,如果您按下是,则数据将再次发布。

正确的解决方案是在发布后重定向到当前页面。

答案 3 :(得分:0)

Answer by @Karthick Kumar 是错误的,因为当有 <input type="file" name="file"> 时,即使用户没有选择文件,$_FILES["file"] 也永远不会为空(使用 { {1}} 并亲眼看看)!

@Anirban's answer完全正确,我只是想用更令人信服的方式解释一下:

print_r()

最好的方法是:

echo( !empty($_FILES["file"]["name"]) ); //works as expected
echo( !empty($_FILES["file"]["type"]) ); //works as expected
echo( !empty($_FILES["file"]["tmp_name"]) ); //works as expected

echo( $_FILES["file"]["size"] > 0 ); //more convincing way!

Link to the list of error codes