如果条件不起作用,为什么以下上传?

时间:2010-03-23 22:02:07

标签: php

所以我有一个上传脚本,我想检查正在上传的文件类型。我只想要pdf,doc,docx和文本文件

所以我有:

$goodExtensions = array('.doc','.docx','.txt','.pdf', '.PDF');
$name = $_FILES['uploadFile']['name'];
$extension = substr($name, strpos($name,'.'), strlen($name)-1);


 if(!in_array($extension,$goodExtensions) || (($_FILES['uploadFile']['type'] != "applicatioin/msword") || ($_FILES['uploadFile']['type'] != "application/pdf"))){
     $error['uploadFile'] = "File not allowed. Only .doc, .docx, .txt and pdf";
 }

为什么我在测试并包含正确的文档时遇到错误?

4 个答案:

答案 0 :(得分:2)

由于您在表达式中使用OR而不是AND:

 if (!in_array($extension,$goodExtensions)
     || (($_FILES['uploadFile']['type'] != "applicatioin/msword")
         || ($_FILES['uploadFile']['type'] != "application/pdf"))) {
     $error['uploadFile'] = "File not allowed. Only .doc, .docx, .txt and pdf";
 }

总是计算结果为true:如果文件扩展名列在数组goodExtensions中,则第一个表达式为false。但是,由于文件类型不能同时 Word和PDF,因此第二个括号内的表达式始终为真。

因此,如果您想确保 文件扩展名,MIME类型是好的,那么正确的表达式将是(包括“应用程序中的拼写错误修正”) / MSWORD“):

 if (!in_array($extension,$goodExtensions)
     || (($_FILES['uploadFile']['type'] != "application/msword")
         && ($_FILES['uploadFile']['type'] != "application/pdf"))) {
     $error['uploadFile'] = "File not allowed. Only .doc, .docx, .txt and pdf";
 }

答案 1 :(得分:1)

substr的第三个参数是长度,而不是结束位置。如果你想要一切直到字符串结尾只是完全省略第三个参数:

$extension = substr($name, strpos($name,'.'));

您在application中拼写错误applicatioin/msword

最后,您可能希望使用strrpos而不是strpos,以防文件名在分隔扩展名之前包含其他点。

编辑:if语句中的逻辑也是错误的。如果扩展名未知,或类型不是MS Word,或类型不是PDF,则会出错。这种类型不能同时出现,因此它总是会失败。我想你希望最后||成为&&

答案 2 :(得分:0)

可能是因为if语句中的这3个条件中的一个(或多个)返回true

答案 3 :(得分:0)

  

为什么我在测试并包含正确的文档时遇到错误?

我不知道,但你最好把大的“if”分成单个块来找出错误。

生成MIME类型和文件扩展名的测试输出。

echo "Extension = ".$extension."<br>";
echo "MIME Type = ".$_FILES['uploadFile']['type']; 

此外,有一件事引起了人们的注意:applicatioin/msword中的拼写错误。