【问题标题】:$_FILES['input']['type'] not working?$_FILES['input']['type'] 不工作?
【发布时间】:2012-12-07 23:51:06
【问题描述】:

这是我的代码:

if ( $_FILES['photo']['type'] != "image/jpeg" )
    echo "You attempted to upload a file of type: " . $_FILES['photo']['type'] . " ... The file must be a JPEG.";

如您所见...我的代码正在检查文件类型是否为 JPEG...如果是,则继续,否则不继续。

但即使类型是 JPEG,我也不断得到回应:它不是:

“您尝试上传的文件类型为:image/jpeg ... 该文件必须是 JPEG。”

除非文件不是 JPEG,否则无法执行 echo 语句。

【问题讨论】:

  • 您的 JPEG 文件类型是什么?当您尝试时,您的脚本会回显什么?我在您的代码示例中没有看到 if/else 约束。
  • 我的 JPEG 文件类型是什么? ... JPEG? ...唯一重要的规则是!= ...并且即使它是JPEG,也会执行回显。
  • 但您的更新显示您不是在上传图像/jpeg,而是在上传文本/jpeg。我认为这里真正的问题是什么是文本/jpeg
  • 如您所见,它是“text/jpeg”而不是“image/jpeg”。您的服务器或浏览器提交了错误的 MIME 类型。除了字符串文件类型检查,尝试使用imagejpeg 处理图像文件
  • @KaiQing ASCII 艺术在 jpeg 中? ;)

标签: php file-upload jpeg


【解决方案1】:

不要相信 mime 类型。如果你想非常确定,打开文件,读取前几个字节,然后检查它是否是 JPEG 文件头。

如果您想非常确定,请使用imagecreatefromjpeg 来实际加载 jpeg 文件。如果这失败了,那么它显然不是一个真正的 jpeg 文件,无论 mime 类型和文件头告诉你什么。请注意,您需要有GD 才能使用此功能。

【讨论】:

  • 读取文件头的故障安全方法是什么?无论使用什么浏览器等,这都必须工作。
【解决方案2】:

我使用一个简单的代码进行文件上传。它实际上检查文件扩展名,而不是 mime 类型。代码如下 -

function getFileExtention($name) {
    $split = explode('.',$name);
    $splitCount = count($split) - 1;
    return strtolower($split[$splitCount]);
}

if(getFileExtention($_FILES['input']['name'] != "jpg" && getFileExtention($_FILES['input']['name'] != "jpeg") {
  echo "You attempted to upload a file of type: " . $_FILES['photo']['type'] . " ... The file must be a JPEG.";
}

【讨论】:

    【解决方案3】:

    依赖 $_FILES 数组中给出的 mime 类型或文件名是不安全的,因为它们是由浏览器给出的。

    改用finfo_file,它将根据文件的标题/内容在服务器端检查:

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = finfo_file($finfo, $_FILES['input']['tmp_name']);
    if ($mimeType != "image/jpeg") {
        echo "You attempted to upload a file of type: " . $mimeType . " ... The file must be a JPEG.";
    }
    finfo_close($finfo);
    

    有关文档,请参阅 http://php.net/manual/en/function.finfo-file.php

    【讨论】:

      【解决方案4】:

      使用$ext = pathinfo($_FILES["$key"]['name'], PATHINFO_EXTENSION);

      直接来自 PHP 的 api 的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 2019-03-10
        • 2013-05-29
        • 2018-11-01
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多