1

我目前正在为正在构建的站点构建文件上传器,但文件类型有问题,我需要它能够上传 html、css、javascript、json 文件,但不能上传 PHP 等。我的问题是我似乎不能找出文件类型名称。有关更多详细信息,请参见下文。

<?php
 if (($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
{
if ($_FILES["file"]["error"] > 0)
  {
  echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
  }
 else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
 echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

  if (file_exists("upload/" . $_FILES["file"]["name"]))
  {
  echo $_FILES["file"]["name"] . " already exists. ";
  }
else
  {
  move_uploaded_file($_FILES["file"]["tmp_name"],
  "upload/" . $_FILES["file"]["name"]);
  echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
  }
   }
  }
  else
  {
  echo "Invalid file";
  }
?>

它有图像/jpeg 的地方,我试过 .html 和 html 都无济于事,还有 .js 等,我就是想不通!帮助!!!:D

4

3 回答 3

3

如果您指的是:

echo "Type: " . $_FILES["file"]["type"] . "<br />";

这是哑剧类型。如果要查看文件扩展名,则必须解析文件名本身。例如:

$ext = substr(strrchr($_FILES["file"]["name"], '.'), 1);

要允许/禁止,最好使用 switch:

switch ($_FILES["file"]["type"]) {
    case 'image/jpeg':
    case 'image/gif':
        // Allowed
    break;
    default:
        // Not allowed
    break;
}


switch ($ext) {
    case 'jpeg':
    case 'gif':
    case 'jpg':
        // Allowed
    break;
    default:
        // Not allowed
    break;
}
于 2012-06-26T09:23:14.827 回答
0

我可以建议一种不同的方法吗?

不要依赖文件类型,而是检查扩展名。

这方面的小例子是:

$parts = array();
$parts = explode( ".", $_FILES['file']['name'] );

if ( !empty($parts) && is_array($parts) ) {
    $extension = end( $parts );
} else {
    echo "File name has no extension";
}

if ( $extension == "jpg" || $extension == "jpeg" ) {
    // Do something with the jpeg
} elseif ( $extension == "html" ) {
    // Do something with html
} elseif ( $extension == "js" ) {
    // Do something with js
} else if ( ... /* You can add any conditional based on extension here */ ) {
    // And do whatever you want here
}

这是一个带有多个 if / elseif 语句的基本粗略示例,您可以创建一个 switch 条件,创建一个工厂类等......但想法保持不变。

干杯。

于 2012-06-26T09:27:56.843 回答
0

依赖客户端文件类型是不安全的$_FILES,最好从文件内容中获取。

function mime_type($file_path)
{
    if (function_exists('finfo_open')) {            
        $finfo = new finfo(FILEINFO_MIME_TYPE, null);
        $mime_type = $finfo->file($file_path);
    }
    if (!$mime_type && function_exists('passthru') && function_exists('escapeshellarg')) {
        ob_start();
        passthru(sprintf('file -b --mime %s 2>/dev/null', escapeshellarg($file_path)), $return);
        if ($return > 0) {
            ob_end_clean();
            $mime_type = null;
        }
        $type = trim(ob_get_clean());
        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
            $mime_type = null;
        }
        $mime_type = $match[1];
    }
    return $mime_type;
}
于 2019-08-10T06:52:37.023 回答