验证上传的文件类型

时间:2012-11-29 11:39:34

标签: php mysql

为什么下面没有认识到正在上传图片(.jpg)?

我上传的文件不是图片!!!

$finfo = finfo_open(FILEINFO_MIME_TYPE, 'C:\xampp\php\extras\magic\magic.mime');
if(strpos(finfo_file($finfo, $_FILES['userfile']['tmp_name']),"image")===0) {    

  // prepare the image for insertion
  $imgData =addslashes (file_get_contents($_FILES['userfile']['tmp_name']));

  // put the image in the db...
  // database connection
  mysql_connect($host, $user, $pass) OR DIE (mysql_error());

  // select the db
  mysql_select_db ($db) OR DIE ("Unable to select db".mysql_error());

  // our sql query
  $sql = "INSERT INTO uploaded_images
  (image, name)
  VALUES
  ('{$imgData}', '{$_FILES['userfile']['name']}');";

  // insert the image
  mysql_query($sql) or die("Error in Query: " . mysql_error());
  $msg='<p>Image successfully saved in database with id ='. mysql_insert_id().' </p>';
}
else
  $msg="<p>Uploaded file is not an image.</p>";

2 个答案:

答案 0 :(得分:1)

如果您无法访问GD库,则只需使用getimagesize(),如果它不是图像,则返回false。 http://php.net/manual/en/function.getimagesize.php

答案 1 :(得分:0)

检测文件类型令人惊讶地不可靠。一些较简单的低级文件类型检测程序只使用文件扩展名来尝试确定类型。

最好使用专门用于图像的工具,例如imagemagick,如果您能够在运行代码的服务器上安装它。这是一个示例,它将告诉您文件是否实际上是JPEG图像而不依赖于文件名:

exec("identify $image_file",$out);
if(!empty($out)){
    $info = $out[0];
    $info = explode(' ',$out[0]);
    $type = $info[1];
    if($type == 'JPEG'){
        return true;
    }
}

但是,如果您无权安装imagemagick,则可以使用GD库。如果做不到这一点,你要么必须相信文件扩展名是正确的,要么只相信文件是图像。

另外,在数据库中保存图像并不是一个好主意,尤其是当它们作为渲染图像传递时。 MySQL并不是为了提高效率而设计的。最好将它们作为文件存储在可以公开查看的目录中。话虽如此,我不知道您的申请,因此您最适合确定最佳行动方案。