File upload 在php中检测mime类型时遇到问题

File upload 在php中检测mime类型时遇到问题,file-upload,mime-types,File Upload,Mime Types,我有一个表单可以接受CVS文件的上传。 因此,我用以下方法保护它: if (!in_array($mimeType, array("text/csv"))) throw new TMSException("Error"); $mimetypes = array('application/vnd.ms-excel','text/csv'); if(in_array($_FILES['file']['type'],$mimetypes)){ // do something } else {

我有一个表单可以接受CVS文件的上传。 因此,我用以下方法保护它:

if (!in_array($mimeType, array("text/csv"))) throw new TMSException("Error");
$mimetypes = array('application/vnd.ms-excel','text/csv');
if(in_array($_FILES['file']['type'],$mimetypes)){
  // do something
} else {
  die("MIME type is not allowed");
}
我的所有测试在我的开发环境中都进行得很顺利,但现在我发现,在windows客户端上,对于相同的文件,我得到了不同的mime类型

这是我在Ubuntu PC上连接时得到的结果:

/var/www/ct/preinvoice.php:203:
array (size=1)
  'tariffLines' => 
    array (size=5)
      'name' => string 'C&T - Labatut.csv' (length=17)
      'type' => string 'text/csv' (length=8)
      'tmp_name' => string '/tmp/php2vIcaE' (length=14)
      'error' => int 0
      'size' => int 3812
这是我在尝试从windows计算机上载相同文件时得到的结果:

/var/www/ct/preinvoice.php:203:
array (size=1)
  'tariffLines' => 
    array (size=5)
      'name' => string 'C&T - Labatut.csv' (length=17)
      'type' => string 'application/vnd.ms-excel' (length=24)
      'tmp_name' => string '/tmp/phpPaMvN3' (length=14)
      'error' => int 0
      'size' => int 3812

你知道为什么PHP会为同一个文件检测到不同的mime类型吗?我如何解决这个问题?

您可以通过执行以下操作来发现这个问题:

if (!in_array($mimeType, array("text/csv"))) throw new TMSException("Error");
$mimetypes = array('application/vnd.ms-excel','text/csv');
if(in_array($_FILES['file']['type'],$mimetypes)){
  // do something
} else {
  die("MIME type is not allowed");
}

mime类型可能不是“text/csv”,某些系统以不同方式读取/保存它们。(Internet Explorer将.csv文件视为应用程序/vnd.ms excel)您好!我正在用相同的文件和chrome在两种环境下测试上传,在windows中,$\u文件[“file”][“type”]是“application/vnd.ms excel”;我想我必须使用另一种方法客户端设置MIME类型。您无法控制它。它可以是同一个文件,只是Windows对它的处理不同而已。大多数浏览器都从这里的注册表中提取mime类型。虽然您的回答是正确的,但我不想接受excel文件。我使用了
$finfo=finfo\u open(FILEINFO\u MIME\u类型);$mimeType=finfo_文件($finfo,$_文件[“tariffLines”][“tmp_名称]);finfo_close($finfo)
强制系统检查mime类型。这样,每次我得到一个“文本/普通”mime类型