【问题标题】:Why is PHP's move_uploaded_file() method returning false in my script?为什么 PHP 的 move_uploaded_file() 方法在我的脚本中返回 false?
【发布时间】:2011-08-07 07:20:25
【问题描述】:

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

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

<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 没有定义为我表单中文件的临时名称吗?

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

非常感谢

【问题讨论】:

  • 您的权限是什么样的?
  • 该文件夹在我的本地机器上,并且该文件夹似乎没有任何特殊限制。
  • 发生错误时,您可以使用 $_FILES['uploadedfile']['error'] 并检查到底发生了什么(我的猜测是您将文件移动到不存在的目录)。在处理文件上传时如何解释错误消息,请咨询 php.net。
  • 我一直遇到的错误是“未定义的索引:uploadedfile”我认为表单为我将文件添加到了这个数组中......我应该自己在某个地方添加它吗?
  • 更好的是,总是检查是否$_FILES['uploadedfile']['error'] == UPLOAD_ERR_OK 并在错误时采取相应措施(请参阅php.net/manual/en/features.file-upload.errors.php)。

标签: php html file forms upload


【解决方案1】:

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

没有&lt;/form&gt;结束标签,所以它被插入到下一个合适的点,即

<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 … 之前删除&lt;

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

【讨论】:

  • 非常感谢,这确实是问题所在!我只是假设它是 PHP,因为我对它很陌生!不过有一件事......我一直在测试这个脚本,因为它可以运行......当我上传 .mp3 文件时它仍然会导致错误。我认为这只是大小问题,但即使是
  • @Paul:这应该不会造成任何问题;我唯一看到的是您粘贴的代码包含最大文件大小规则 总是对照php.net/manual/en/features.file-upload.errors.php 上的值检查文件数组的'error' 段的状态,您就会知道是否有什么(以及什么)出错了(例如,UPLOAD_ERR_FORM_SIZE)。
【解决方案2】:

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

就文档而言,有两种情况可以从move_uploaded_file 函数返回 false:

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

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

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

所以它一定与这个catch all有关。我建议打开display_errors,这样我们就可以看到生成的警告。

【讨论】:

  • 我认为它在较早的地方出错了,因为$_FILES中的错误“未定义索引:上传文件”。
  • 我得到的错误是:注意:未定义的索引:第 8 行 C:\Users\Paul\Desktop\XAMPP\htdocs\xampp\uploader.php 中的上传文件注意:未定义的索引:C 中的上传文件:\Users\Paul\Desktop\XAMPP\htdocs\xampp\uploader.php 在第 10 行
【解决方案3】:

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

【讨论】:

  • 感谢您的意见,但这应该是一个评论。更重要的是,正如您在上面看到的,我已经通过此消息发布了对该问题的评论(是的,我知道如果您的代表低于 50,您不能对其他人的问题发表评论)。
  • hmm,当我这样做时,我得到一个额外的错误:注意:未定义的变量:C:\Users\Paul\Desktop\XAMPP\htdocs\xampp\uploader.php 中的 target_path 在第 10 行跨度>
猜你喜欢
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2012-12-31
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多