为什么PHP的move_uploaded_file()方法在我的脚本中返回false?

时间:2011-04-17 12:44:30

标签: php html file forms upload

我正在构建一个页面,允许将文件上传到服务器并进行排序。我知道这段代码,即使它正常工作,也不适合现场使用,它只是让机制工作的第一稿,因为我对服务器端脚本很新。

无论如何,这是上传表单页面:

<html>
<body>
<?php include("header.php"); ?>
<center>
<h1>Please enter the details of the file you would like to upload:</h1><br/> 


    <table> 
    <tr>
    <td align='center'> 
    <form action='uploader.php' method='POST' enctype='multipart/form-data'><b>Name:</b> </td> 
    <td align='left'><input type='text' name='name' maxlength='255' />
    </td>
    </tr> 

    <tr>
    <td align='center'><b>Description of file uploaded: </b>
    </td> 
    <td align='left'><textarea name='description' rows='5' cols='20'></textarea>
    </td>
    </tr> 

    <tr>
    <td align='center'><b>Category: </b>
    </td> 

    <td align='left'> 
    <select name='category'> 
    <option value='1'>Agriculture</option>
    <option value='2'>Sexual Health</option>
    <option value='3'>Arithmetic</option>
    <option value='4'>Technology</option>
    <option value='5'>Reading/Literature</option>
    <option value='6'>Health/Medicine</option>
    </td>
    </tr>

    <tr>
    <td align ='center' >
    <b>File: </b>
    </td>
    <td align='left'>
    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
    <Choose a file to upload: <input name="uploadedfile" type="file" /><br />
    </td>
    </tr>

    <tr height='20px'></tr> 

    <tr align ='left'>
    <td> </td>
    <td>
    <input type='Submit' value='Upload File' /> 
    </td>
    </tr>
    </table> 

</center>

<?php include("footer.php"); ?>
</body>
</html>

这是行动页面uploader.php:

<?php

$target_path = "./audio/";

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

if(move_uploaded_file( $_FILES['uploadedfile']['tmp_name'], $target_path) )  {
    echo "The file " .  basename( $_FILES['uploadedfile']['name']) . " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
}

?>

每当我尝试测试时,在我的localhost上(使用XAMPP)它回声“上传文件时出错,请再试一次!”

每隔几次它也说:“ 注意:未定义的索引:第5行的C:\ Users \ Paul \ Desktop \ XAMPP \ htdocs \ xampp \ uploader.php中的上传文件“

但我不明白这个论点有什么问题?是不是将uploadfile定义为我表单中文件的临时名称?

你能告诉我这里做错了什么吗?

非常感谢

3 个答案:

答案 0 :(得分:1)

您似乎正在正确调用该函数并在正确的上下文中使用它。

就文档而言,有两个实例可以从move_uploaded_file函数返回false:

  

如果filename不是有效的上传文件,则不会执行任何操作,move_uploaded_file()将返回FALSE。

我们可以假设情况并非如此,因为我们正在使用tmp_name数组中文件中的$_FILES元素。

  

如果filename是有效的上传文件,但由于某种原因无法移动,则不会执行任何操作,move_uploaded_file()将返回FALSE。此外,还会发出警告。

所以它必须与 catch all 有关。我建议启用display_errors,以便我们可以看到生成的警告。

答案 1 :(得分:1)

if ($_FILES['uploadedfile']['error'] != 0)会告诉您错误的可能原因。 查看http://www.php.net/manual/en/features.file-upload.errors.php以获取错误代码

答案 2 :(得分:1)

问题是:您的HTML无效,导致form元素过早关闭。

没有</form>结束标记,因此它会在下一个适当的位置插入,即

<td align='center'>
  <form action='uploader.php' method='POST' enctype='multipart/form-data'>
    <b>Name:</b>
  </form> <!-- <- here -->
</td> 

这样做,名称为uploadedfile的文件输入元素位于表单之外,永远不会发送到uploader.php。要解决此问题,请将开始标记移到table之外,在body末尾附近添加结束标记,然后在<之前移除Choose a file …

还有其他一些验证错误,但我会留给您修复它们。下次,请将您的HTML提供给W3C的validator(您可以使用Chris Pederick的Web Developer toolbar自动执行此操作)和/或查看Firebug / Chrome的Web检查器并查看form元素(以及它包含的内容。)