【问题标题】:Check if the image is a JPEG检查图像是否为JPEG
【发布时间】:2015-01-22 06:06:40
【问题描述】:

我需要检查给定的图像是否为 JPEG。

if ($_FILES["fname"]["error"] > 0) {
    $imgData = "hyperlink/holder.jpg";
} else {
    $imgData ="hyperlink/" . $_FILES["fname"]["name"];
}
// Only accept jpg images
// pjpeg is for Internet Explorer should be jpeg
if (!($_FILES["fname"]["type"] == "image/pjpeg") ) {
    print "I only accept jpg files!";
    exit(0);
}

当它转到第一个 if 语句中的第一个语句时,它总是给出我只接受 jpg 文件!

我该如何解决?

【问题讨论】:

    标签: php image


    【解决方案1】:

    试试exif_imagetype图片功能。

    例子:

    if(exif_imagetype($filepath) != IMAGETYPE_JPEG){
        echo 'Not a JPEG image';
    }
    

    【讨论】:

      【解决方案2】:

      PHP 有这么好的图像类型支持,我想知道你为什么要限制你的应用程序。只需几行代码,您就可以处理任何输入格式并转换为 jpeg,如果需要的话...

      $im = imagecreatefrompng(input_filename)
      imagejpeg($im, output_filename);
      

      【讨论】:

        【解决方案3】:

        我相信以下工作:

        还要注意:

        (exif_imagetype($ImagePathAndName) == IMAGETYPE_JPEG)

        仅读取前几个字节以查找图像标题,因此不足以确认图像是否损坏。

        下面我将它放在一个逻辑“and”语句中,即必须通过这两个测试才能使图像符合有效和非损坏等条件:

        if ((exif_imagetype($ImagePathAndName) == IMAGETYPE_JPEG) && (imagecreatefromjpeg( $ImagePathAndName ) !== false ))
        {
        echo 'The picture is a valid jpg<br>';
        }
        

        注意:您需要将这行代码放在php代码的顶部,以避免在遇到伪造/损坏的图像文件时看到来自imagecreatefromjpeg($ImagePathAndName)的警告消息。

        ini_set(‘gd.jpeg_ignore_warning’, 1);
        

        【讨论】:

          【解决方案4】:

          您为什么不尝试创建一个异常数组(您希望用户能够上传的文件)。

          // Hyperlink for your website
          $hyperlink = "http://www.yourwebsitehere.com";
          
          if($_FILES['fname']['error'] > 0)
          {
              $image= $hyperlink . "/holder.jpg";
          } 
          else
          {
              $image = $hyperlink . "/" . $_FILES['fname']['name'];
          }
          
          // Only accept files of jpeg format
          $exceptions = array("image/jpg", "image/jpeg", "image/pjpeg");
          
          foreach($exceptions as $value)
          {
              if($_FILES['fname']['type'] != $value)
              {
                  echo "I only accept jpeg images!";
                  break; // Or exit();
              }
          }
          

          【讨论】:

          • 没有分配$_FILES['fname']['type'] 将永远跳过 if 块。 (即成功)
          【解决方案5】:

          当使用$_FILES 时,您依赖于客户端发送的信息,这不是最好的做法(您已经看到它并不总是相同,如果我没记错的话,$_FILES['...']['type'] 可以是伪造的)。

          如果你使用 PHP >= 5.3(或者可以安装 PECL 包),也许你可以看看扩展 Fileinfo。如果您使用的是旧版本,mime_content_type 呢?

          而且,正如 Scott 所说,为什么只允许 jpeg?

          更好地查看代码:当您处于第一种情况 (error &gt; 0) 时,您正在为 $imgData 分配一个默认文件?为什么“超链接”周围的空格? 为什么你总是用检查content-type,即使之前有几行错误?

          最后,您是否看过手册 (Handling file uploads)?

          【讨论】:

            【解决方案6】:

            Check the mime(多用途 Internet 邮件扩展)类型的文件,带有此代码。并验证您想要的类型。您还可以使用此代码检测 png、gif。

             if($_FILES["fname"]["type"] == "image/jpeg")
              {
                  echo "File type is JPEG";
              }
            

            【讨论】:

            • 不过,黑客可以轻松伪造 mime 类型。
            • 投反对票 - 正如@hanshenrik 建议的那样,这并不安全。作为第一次初始检查,它可能很有用,可以在以后的步骤中节省一些计算能力,例如使用fileinfo
            猜你喜欢
            • 2021-07-28
            • 1970-01-01
            • 2011-01-12
            • 2013-10-24
            • 2014-01-10
            • 1970-01-01
            • 1970-01-01
            • 2018-04-28
            • 2012-04-20
            相关资源
            最近更新 更多