所以我有一个上传脚本,我想检查正在上传的文件类型。我只想要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";
}
为什么我在测试并包含正确的文档时遇到错误?
答案 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
中的拼写错误。